每天分享技术栈,开发工具等
天天学,应该把这些基本spring底层概念了解下,更好的理解我们常用框架的套路。
1.Servlets是SUN公司指定的一套开发动态网页的技术。一般JavaEE相关的类,都是以javaX开头
2. Servlet规范核心类图,他们之间的关系如图下:
1. 编写一个Servlet案例应用的基本过程:
a) 建立一个标准的JavaWeb应用目录:
比如:
|--MyWebApp:
|--WEB-INF
|--classes:用来存放java运行的class文件
|--lib:存放web应用中需要的jar包
web-xml:配置文件,通常配置servlet类的访问映射
|--jsp css js等网页文件
b) 进入classes目录,建立一个java扩展名文件,这些java文件统称为Servlet,它们都必须间接或直接实现javax.servlet.Servlet接口。例如以下代码:
package com.lsh.itcast;
import java.io.*;
import javax.servlet.*;
public class ServerletDemo extends GenericServlet{
public void service(ServletRequest req,ServletResponse rep)
throws ServletException, IOException{
System.out.println("执行service方法");
OutputStream out=rep.getOutputStream();
out.write("hello my servlet".getBytes());
out.close();
}
}
a) 进入classes目录,对我们编写的类进行编译。
首先是Tomcat的lib目录下的servlet-api.jar,部署到当前的classpath环境变量中。在dos命令行的临时配置法是:
set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
然后在dos命令行使用cd命令进入到classes目录下,编译Servlet类
编译命令:javac -d . 类名.java
b) 修改web应用中WEB-INF目录下的web.xml,对servlet类进行url地址映射,配置如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>ServerletDemo</servlet-name>
<servlet-class>com.lsh.itcast.ServerletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServerletDemo</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
a) 把已建立好的web应用配属到Tomcat中,并启动服务器
b) 访问地址是:http://localhost:8080/MyWebApp/test
看到写的Servlet类的输出结果,表示Servlet操作成功
1. Servlet的生命周期:在内存中一个Servlet只有一个实例,针对不同的的用户请求,容器采用多线程的机制来调用Service方法。容器什么时候开始装载Servlet呢?在以下四种情况下,Servlet被启动,容器装载Servlet的时刻。
a) 容器启动时会自动的装载某些需要的Servlet
b) 在容器启动后,客户首次向Servlet发出请求
c) Servlet的类文件被更新后,重新装载Servlet
d) Servlet被装载后,Servlet容器创建一个Servlet实例并调用init()方法进行初始化。在Servlet的整个生命周期中,init方法只会调用一次。
如果在web.xml中加上:<load-on-startup>2</load-on-startup>。作用在于:
某些Servlet在web.xml文件中只有<servlet>元素而没有<servley-mapping>元素,这样我们就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。
Servlet的生命周期的常用方法:
a) public void init(ServletCOnfig config):对Servlet进行初始化,Servlet类被实例化后就执行,且执行一次。由容器调用。默认情况下,只有第一次方访问时才执行,且执行一次。
b) public void destroy():在内存中销毁了Servlet对象。
1. Servlet的生命周期:在内存中一个Servlet只有一个实例,针对不同的的用户请求,容器采用多线程的机制来调用Service方法。容器什么时候开始装载Servlet呢?在以下四种情况下,Servlet被启动,容器装载Servlet的时刻。
a) 容器启动时会自动的装载某些需要的Servlet
b) 在容器启动后,客户首次向Servlet发出请求
c) Servlet的类文件被更新后,重新装载Servlet
d) Servlet被装载后,Servlet容器创建一个Servlet实例并调用init()方法进行初始化。在Servlet的整个生命周期中,init方法只会调用一次。
如果在web.xml中加上:<load-on-startup>2</load-on-startup>。作用在于:
某些Servlet在web.xml文件中只有<servlet>元素而没有<servley-mapping>元素,这样我们就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。
Servlet的生命周期的常用方法:
a) public void init(ServletCOnfig config):对Servlet进行初始化,Servlet类被实例化后就执行,且执行一次。由容器调用。默认情况下,只有第一次方访问时才执行,且执行一次。
b) public void destroy():在内存中销毁了Servlet对象。
1. 关于web-xml文件的Servlet的配置:
a) 一个Servlet可以被映射到多个URL地址上,即配置两个URL去映射一个Servlet,这两个URl都可以去访问这个Servlet。
b) URL地址映射支持通配符*。即*代表只要这个URL是字母,都可以去访问映射的Servlet,
i. 以*开头,以扩展名结尾。比如<url-pattern>*.do</url-pattern>
ii. 以/前缀开头,以*结尾。比如<url-pattern>/action/*</url-pattern>
iii. 如果一个Servlet的映射为一个"/",就称之为默认的Servlet,它负责处理没有映射路径的URL请求的响应。
但当一个web.xml有多个使用通配符时,会遵循一定的优先级规则。
a) 绝对匹配:以"/"开头(方式二)要比"*"开头(方式一)优先级高
b) 都以"/"开头,还是有多个匹配,找最匹配的
c) 以"/"开头(方式二)要比"*"开头(方式一)优先级高
2. Servlet的多线程同步问题:Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即数据不一致。
解决办法:去除成员变量,使用局部变量.或者是使用同步代码块。
建议:在Servlet中定义变量时,除非特殊要求,尽量使用局部变量,当如果有需要实例变量时,应做同步处理,且同步代码块尽量包围少的代码。
java——零基础10天教程 附完整视频+工具+面试简历模板 强力推荐2020-10-20
猿们你们开发是用的这些软件吗?必备软件。建议收藏!2020-10-19
END
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时本公众号可以第一时间接受到博文推送。