**
1、Servlet
**
Servlet 是服务端的 Java 应用程序,用于处理HTTP请求,做出相应的响应。
当客户端向服务器发出HTTP请求时,首先会由服务器中的 Web 容器(如Tomcat)对请求进行路由,交给该URL对应的 Servlet 进行处理,Servlet 所要做的事情就是返回适当的内容给用户。
在这里,我顺便谈谈自己对 JSP 和 Servlet 两者关系的理解。JSP 页面实际是被转换成了 Servlet 的形式运行,也就是说,我们可以将不同的 JSP 页面视为不同的 Servlet,理论上它们中的每一个都能够对客户端请求做出响应,只不过这些 Servlet 可能会将请求转发给其它 Servlet 进行处理,进而由其它 Servlet 做出响应。
要创建自己的 Servlet,可以通过以下三种方式来实现
- 实现 Servlet 接口
- 继承 GenericServlet 类
- 继承 HttpServlet 类
它们的 package 分别是:javax.servlet.Servlet、javax.servlet.GenericServlet、javax.servlet.http.HttpServlet。
**
2、Filter(过滤器)
**
Filter 是介于 Web 容器和 Servlet 之间的过滤器,用于过滤未到达 Servlet 的请求或者由 Servlet 生成但还未返回响应。
客户端请求从 Web 容器到达 Servlet 之前,会先经过 Filter,由 Filter 对 request 的某些信息进行处理之后交给 Servlet。
同样,响应从 Servlet 传回 Web 容器之前,也会被 Filter 拦截,由 Filter 对 response 进行处理之后再交给 Web 容器。
若要创建自定义 Filter,需要实现 javax.servlet.Filter 接口。
**
3、Listener(监听器)
**
Listener 是用于监听某些特定动作的监听器。当特定动作发生时,监听该动作的监听器就会自动调用对应的方法。
以 HttpSessionListener 为例:
该 Listener 监听 session 的两种状态,即创建和销毁。当 session 被创建时,会自动调用 HttpSessionListener 的 sessionCreated() 方法,我们可以在该方法中添加一些处理逻辑。当 session 被销毁时,则会调用 sessionDestroyed() 方法。
下面是 Servlet 中的 8 个 Listener 接口,可分为三类:
第一类,ServletContext 相关接口
- ServletContextListener:用于监听 ServletContext 的启动和销毁。
- ServletContextAttributeListener:用于监听 application 范围的属性变化。
第二类,HttpSession 相关接口
- HttpSessionListener:用于监听 session 的创建和销毁。
- HttpSessionIdListener:用于监听 session 的 id 是否被更改。
- HttpSessionAttributeListener:用于监听 session 范围的属性变化。
- HttpSessionActivationListener:用于监听绑定在 HttpSession 对象中的 JavaBean 状态。
- HttpSessionBindingListener:用于监听对象与 session 的绑定和解绑。
第三类,ServletRequest 相关接口
- ServletRequestListener:用于坚挺 ServletRequest 对象的初始化和销毁。
- ServletRequestAttributeListener:用于监听 ServletRequest 对象的属性变化。
**
4、拦截器Interceptor(Spring MVC)
**
类似 面向切面编程 中的 切面 和 通知,我们通过 动态代理 对一个 service() 方法添加 通知 进行功能增强。比如说在方法执行前进行 初始化处理,在方法执行后进行 后置处理。拦截器 的思想和 AOP 类似,区别就是 拦截器 只能对 Controller 的 HTTP 请求进行拦截。
**
5、过滤器 VS 拦截器
**
5.1 两者的区别
- Filter 是基于 函数回调的,而 Interceptor 则是基于 Java 反射 和 动态代理。
- Filter 依赖于 Servlet 容器,而 Interceptor 不依赖于 Servlet 容器。
- Filter 对几乎 所有的请求 起作用,而 Interceptor 只对 Controller 对请求起作用。
5.2 执行顺序
对于自定义 Servlet 对请求分发流程:
- Filter 过滤请求处理;
- Servlet 处理请求;
- Filter 过滤响应处理。
对于自定义 Controller 的请求分发流程:
- Filter 过滤请求处理;
- Interceptor 拦截请求处理;
- 对应的 HandlerAdapter 处理请求;
- Interceptor 拦截响应处理(postHandle());
- Interceptor 的最终处理(afterCompletion());
- Filter 过滤响应处理。