一、初识Servlet
1.1 概述
Servlet就是一个用java语言编写的接口,定义了Java类被浏览器访问到的规则。
Servlet技术是应用到web服务器端的扩展技术,对http请求进行处理,主要用于处理各种业务逻辑。
注意:1. 对http请求进行处理,实际为servlet接口的实现类HttpServlet提供了处理请求的方法;
2. Servlet的具体细节需要由Servlet容器进行实现,Servlet对象在Servlet容器启动时被初始化。
1.2 特点
功能强大、可移植、性能高效、安全性高、可扩展性好。
1.3 生命周期
1. 创建:执行init方法,只执行一次
* Servlet什么时候被创建?
* 默认情况下,第一次被访问时,Servlet被创建
* 可以配置执行Servlet的创建时机,默认下的默认值为-1。
* 在标签下配置
1. 第一次被访问时创建
* 的值为负数
2. 在服务器启动时创建
* 的值为0或正整数
* Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
* 多个用户同时访问时,可能存在线程安全问题。
* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值。
2. 运行:执行service方法,执行多次
* 每次访问Servlet时,Service方法都会被调用一次。
3. 销毁:执行destroy方法,只执行一次
* Servlet被销毁时执行。服务器关闭时,Servlet被销毁。
* destroy方法在Servlet被销毁之前执行,一般用于释放资源。
* 只有服务器正常关闭时,才会执行destroy方法。
1.4 Servlet的体系结构
Servlet -- 接口
|
GenericServlet -- 抽象类
|
HttpServlet -- 抽象类
* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
* HttpServlet:对http协议的一种封装,简化操作:
1. 定义类继承HttpServlet
2. 复写doGet/doPost方法
二、Servlet配置
2.1 web.xml配置
在web.xml中配置,以告知web容器哪一个请求调用哪一个Servlet对象处理,对Servlet起到一个注册的作用。
// 声明Servlet对象
WfxServlet--Servlet名称
com.wfx.WfxServlet--Servlet对象的完整位置
// 映射Servlet
WfxServlet--Servlet名称
/WfxServlet--映射访问URL
执行流程:
1. 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径;
2. 查找web.xml文件,是否有对应的标签体内容与资源路径一致;
3. 如果有,则在找到对应的全类名;
4. tomcat会将字节码文件加载进内存,并且创建其对象;
5. 调用其方法。如:service()方法。
2.2 Servlet3.0 注解配置
小贴士:
Servlet3.0新特性
①支持注解配置。新增注解@WebServlet、@WebFilter、@WebListener、@WebInitParam等,通过使用注解就无需在web.xml文件中对Servlet、过滤器或者监听器等进行配置。
②对文件上传的支持。文件上传需两步:a.添加@MultipartConfig注释。 b.从request对象中获取Part文件对象。
③异步处理:Servlet线程将请求交给一个异步线程来执行业务处理,线程本身返回至容器,异步线程处理完业务后,可以直接生成响应数据,或者将请求继续转发给其他Servlet。
(这样,Servlet线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步之后可以立即返回。)
异步处理机制可以应用于Servlet和过滤器两种组件,那么如何开启异步处理特性?(默认情况下为关闭异步处理)
==》方法一(配置文件):true
==》方法二(注解):@WebServlet和@WebFilter注解提供了asyncSupported属性,默认情况下为false,将其设置成true即可。
执行步骤:
1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
2. 定义一个类,实现Servlet接口
3. 复写方法
4. 在类上使用@WebServlet注解,进行配置
* @WebServlet("资源路径")
资源路径:Servlet访问路径
1. 一个Servlet可以定义多个访问路径: @WebServlet({"/url1","/url2","/url3"})2. 路径定义规则:
a. /xxx:路径匹配
b. /xxx/xxx:多层路径,目录结构
c. *.do:扩展名匹配
@WebServlet注解源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";//相当于
String[] value() default {};//代表urlPatterns()属性配置
String[] urlPatterns() default {};//相当于
int loadOnStartup() default -1;//相当于
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
三、过滤器--Filter
3.1 概述
实质上就是在web应用服务器上的一个web应用组件,用于拦截客户端和目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源。(过滤器可以改变请求中的内容)
过滤器对象放置在javax.servlet包中,均为接口:
Filter(核心对象)接口:每一个过滤器对象都要直接或间接的实现此接口,其定义了三个方法:
init()方法:过滤器初始化方法,该方法在过滤器初始化时被调用。
doFilter()方法:对请求进行过滤处理。
destory()方法:销毁方法,以便释放资源。
FilterConfig接口:由Servlet容器进行实现,主要用于获取过滤器中的配置信息。
FilterChain接口(传递工具):由Servlet容器进行实现,在这个接口中,只有一个doFilter方法。
doFilter()方法:将过滤后的请求传递给下一个过滤器,直到传递给目标资源。
3.2 执行步骤
1. 定义一个类,实现接口Filter
2. 复写方法
3. 配置拦截路径
* web.xml配置
* 注解配置
3.2.1 web.xml配置
// 过滤器的声明
WfxFilter--过滤器名称
com.wfx.WfxFilter--过滤器完整类名
--初始化参数(可选)
encoding--参数名
UTF-8--参数值
// 过滤器映射
WfxFilter--过滤器名称
/WfxFilter--过滤器URL映射(/*表示匹配所有请求)
3.2.2 注解配置@WebFilter("/拦截路径")
@WebFilter("/拦截路径")//访问所有资源之前,都会执行该过滤器
public class WfxFilter implements Filter {
/**
* 在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源。
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化
}
/**
* 每一次请求被拦截资源时会执行。执行多次。
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
/**
* 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。
* 只执行一次。用于释放资源。
*/
@Override
public void destroy() {
}
}
3.2.3 过滤器配置详解
* 拦截路径配置:
1. 具体资源路径。 比如:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
2. 拦截目录。 比如:/user/* 访问/user下的所有资源时,过滤器都会被执行
3. 后缀名拦截。 比如:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源。 比如:/* 访问所有资源时,过滤器都会被执行
* 拦截方式配置:资源被访问的方式
* web.xml配置
* 设置标签即可
* 注解配置:
* 设置dispatcherTypes属性
1. REQUEST:默认值。浏览器直接请求资源
2. FORWARD:转发访问资源
3. INCLUDE:包含访问资源
4. ERROR:错误跳转资源
5. ASYNC:异步访问资源
3.3 过滤器链(配置多个过滤器)
过滤器先后顺序问题:
1. web.xml配置: 谁定义在上边,谁先执行
2. 注解配置:按照类名的字符串比较规则比较,值小的先执行
* 如: AFilter 和 BFilter,AFilter就先执行了。
四、监听器--Listener
4.1 概述
由容器管理,用于监听web容器的有效期事件。(比如数据库连接的建立与释放,session的创建与销毁,程序启动和关闭等)
监听原理:可以监听由于web应用中状态而引起的servlet容器产生的相应事件,然后接受并处理这些事件。
4.2 事件监听机制
* 事件:一件事情(监听ServletContext对象创建的)
* 事件源:事件发生的地方(如tomcat)
* 监听器:一个对象(监听器类)
* 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码。
4.3 监听器的创建
监听器的创建有很多种,如servlet上下文监听、http会话监听、servlet请求监听,根据不同场景实现不同接口。
步骤:
1. 定义一个类,实现ServletContextListener接口
* ServletContextListener接口:监听ServletContext对象的创建和销毁
* 方法:
* void contextInitialized(ServletContextEvent sce):ServletContext对象创建后会调用该方法
* void contextDestroyed(ServletContextEvent sce):ServletContext对象被销毁之前会调用该方法
2. 复写方法
3. 配置
* web.xml配置
监听器类
* 指定初始化参数
* 注解配置
* @WebListener