JavaWeb 三大器--Listener、Filter 和Interceptor 总结
说明:web.xml的加载顺序是:【Context-Param】->【Listener】->【Filter】->【Servlet】,而同个类型之间的实际程序调用的时候的顺序是根据对应的Mapping的顺序进行调用。
详细介绍:web.xml加载顺序与web.xml常用节点解析
转自:https://www.cnblogs.com/hellovoyager1/p/9152292.html
一、背景
这段时间因为工作不忙,所以有时间来总结整理一下之前遇到的一些问题。在之前项目开发过程中碰到过关于拦截器、过滤器之类的问题(发现自己基础真的薄弱,不过没关系知识一点一滴积累),索性就记录下来。由于笔者知识水平有限,如有不对的地方欢迎批评指正。
二、概念
在讲解三大器之前,我们需要对Servlet 有所了解,因为这个通常是我们在接触Javaweb 时最先了解到的知识点。
1. Servlet
Servlet 是sun 公司提供的一门用于开发动态web 资源的技术,主要功能在于交互式地浏览和修改数据,生成动态Web 页面,我们实际开发应用中,一般不需要去研究Http 协议,只要扩展servlet 接口,即可实现web 服务器应用程序的开发。通俗来讲,就是这个技术可以实现一个由客户端发起请求-->服务器端处理-->客户端得到响应的功能。额。。。还不是很有概念,那Servlet 得生命周期总有印象吧?
这里说个题外话,提到Servlet 的生命周期,首先,这个在面试时经常被问到。
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程(三个重要方法):
①init () 方法进行初始化:
在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet 时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();
②Servlet 调用 service() 方法来处理客户端的请求:
它是Servlet的核心,每当一个客户请求一个HttpServlet 对象,该对象的Service() 方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet 中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
③Servlet 通过调用 destroy() 方法终止(结束):
仅执行一次,在服务器端停止且卸载Servlet 时执行该方法,有点类似于C++ delete 方法。一个Servlet 在运行service() 方法时可能会产生其他的线程,因此需要确认在调用destroy() 方法时,这些线程已经终止或完成。
Servlet 的生命周期的话还需要加上在init() 之前有一个加载和实例化Servlet(反射机制)的过程。
整个过程大概是这样的:
其次,还记得在大三那会去实习,组长给我们讲解Java 知识的时候就有提到过Servlet。记得当时是做一个登录跳转的功能,写一个Java 类,实现Servlet 接口,然后写doGet() 和doPost() 方法,因为这里要处理乱码来着,搞了半天。。。至此,这两点大概是我对Servlet 的最深印象了吧。那么,之后的工作中为什么仿佛彻底与这东西无缘了一样。时至今日,再次提起这个东西才知道一直有在用,只是自己不知道而已。
回到正题,现在我们的Servlet 哪里去了呢?没错,它没有消失,而是在我们的web.xml 文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!-- spring mvc servlet --> <servlet> <description>spring mvc servlet</description> <servlet-name>springMvc</servlet-name> <servlet- class >org.springframework.web.servlet.DispatcherServlet</servlet- class > <init-param> <description>spring mvc 配置文件</description> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>*. do </url-pattern> </servlet-mapping> |
通过这种方式我们就实现对*.do 这样的请求进行统一处理,通常我们也把实现了servlet 接口的java 程序,称之为Servlet。如果换成以前的写法,就是这样的:
Servlet 类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/** * 用户登录校验 * Servlet implementation class LoginServlet */ @WebServlet ( "/LoginServlet" ) public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LoginServlet() { super (); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this .doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //String username = request.getParameter("username"); //String password = request.getParameter("password"); //... // success doGet(request, response); } } |
web.xml 配置:
1
2
3
4
5
6
7
8
9
10
11
12
|
<servlet> <!-- Servlet的注册名称 --> <servlet-name>LoginServlet</servlet-name> <!-- Servlet的完整类名 --> <servlet- class >com.github.servlet.LoginServlet</servlet- class > </servlet> <servlet-mapping> <!-- Servlet的注册名称 --> <servlet-name>LoginServlet</servlet-name> <!-- Servlet的对外访问路径 --> <url-pattern>/servlet/loginServlet</url-pattern> </servlet-mapping> |
访问路径
看到这里终于明白,现在每天都在用的DispatcherServlet 正是以前所接触过得Servlet。进一步跟踪DispatcherServlet 发现果然,他确实是实现了HttpServlet 接口
2.Listener
监听器,从字面上可以看出listener 主要用来监听时用。通过listener 可以监听web 服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。
3.Filter
过滤器,是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
4.Interceptor
拦截器,是在面向切面编程的,就是在你的service 或者一个方法,前调用一个方法,或者在方法后调用一个方法。比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
5.配置方式
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中,spring的拦截器配置到spring.xml中。
三、生命周期
1、servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。
(1)、装入:启动服务器时加载Servlet的实例;
(2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成;
(3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;
(4)、销毁:停止服务器时调用destroy()方法,销毁实例。
2、filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行)
(1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
(2)、每一次请求时都只调用方法doFilter()进行处理;
(3)、停止服务器时调用destroy()方法,销毁实例。
3、listener:类似于servlet和filter
web.xml 的加载顺序是:context- param -> listener -> filter -> servlet
4、interceptor:以struts的拦截器为例,加载了struts.xml以后,初始化相应拦截器。当action请求来时调用intercept方法,服务器停止销毁interceptor。
四、总结
三大器对比:
ps:
1.平时所用的框架(Spring、Structs2等)其实都是基于JavaWeb 这四个知识点来做文章的,如果对原始的JavaWeb 不是很了解,那么在理解这些框架(框架是大牛们对原始JavaWeb进行封装的结果,没有原始JavaWeb开发基础是很难真正学会框架的)上只能是知道是这样做,而不知道为什么要这样做,这种对框架的理解也只是存在表面上,稍微深入一点就得懵逼。
2.自己在实际工作中很多东西做完了就没了,还是缺少一种独立思考的能力。求学,不应该只是不求甚解,更应该有一种知之者不如好之者,好之者不如乐之者的心态,主动学习。
3.站在巨人的肩膀,能看的更远。
JavaWeb 三大器--Listener、Filter 和Interceptor 总结的更多相关文章
- JavaWeb三大器(过滤器、拦截器、监听器)概念梳理
最近工作碰到了一个问题:项目A需要收集项目B中的用户活跃数信息,最后通过HttpSessionAttributeListener实现.在开发过程中,网上查找了过滤器.拦截器.监听器的帖子,这里对自己收 ...
- javaweb(4)之Listener&Filter
监听器 (Listener) 介绍 监听器用于监听 web 应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器 ...
- Java的Servlet、Filter、Interceptor、Listener
写在前面: 使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet.Filter和Servlet规范的所有监听器( ...
- servlet,listener,filter,interceptor的关系
1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Servlet 技术 ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference
- 非spring组件servlet、filter、interceptor中注入spring bean
问题:在filter和interceptor中经常需要调用Spring的bean,filter也是配置在web.xml中的,请问一下这样调用的话,filter中调用Spring的某个bean,这个be ...
- web.xml中的主要元素说明(listener, filter, servlet)
web.xml中加载的顺序为:context-param ---> listener ---> filter ---> servlet. listener:主要针对的是对象的操作,如 ...
- JavaWeb三大组件之一Filter知识总结
[1] Filter简介 > Filter翻译为中文是过滤器的意思. > Filter是JavaWeb的三大web组件之一Servlet.Filter.Listener ...
- javaWeb学习之Listener监听
] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet listener filt ...
随机推荐
- python -- 正则表达式&re模块(转载)
1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...
- C++ Primer Plus 第四章 复合类型 学习笔记
第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...
- Lesson 12 Life on a desert island
Lesson 12 Life on a desert island desert island ['dezət 'ailənd] n. 荒岛 uninhabited island coral isla ...
- 医疗器械软件产品经理必读的法规及标准-YY/T0664(一)
医疗器械软件产品经理必读的法规及标准-YY/T0664(一) 医疗器械软件的产品经理,需要熟读医药行业标准,在软件设计开发的整个生存周期过程中,我们需要根据<YY/T 0664 医疗器械软件 软 ...
- 使用Pycharm创建Django项目无法创建app.
Python3.7使用Django1.11.7创建Django项目报以下错误时: 在使用Pycharm创建Django项目报以下错误时: Traceback (most recent call las ...
- NPM 所有的指令已经问题 使用淘宝镜像 出现code EAI_AGAIN
windows怎么卸载cnpm? npm uninstall cnpm -g windows怎么检测cnpm是否安装成功 cnpm -v 我们直接将node的仓库地址换成淘宝仓库地址即可 单次使用 n ...
- java顺序结构、循环结构、选择结构
java顺序结构.选择结构.循环结构 顺序结构: 语句与语句之间,框与框之间是从上到下的顺序进行的,它是由若干个依次执行的处理步骤执组成的,它是任何一个算法都不离开的一种基本算法结构. 选择结构: 1 ...
- 点云上的深度学习及其在三维场景理解中的应用(PPT内容整理PointNet)
这篇博客主要是整理了PointNet提出者祁芮中台介绍PointNet.PointNet++.Frustum PointNets的PPT内容,内容包括如何将点云进行深度学习,如何设计新型的网络架构 ...
- 记录21.07.24 —— Vue的组件与路由
VUE组件 作用:复用性 创建组件的三种方式 第一种:使用extends搭配component方法 第二种:直接使用component方法 只有用vue声明且命名的才称之为创建组件 注意:templa ...
- C++//递增运算符重载
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 //重载递增运算符 6 7 //自定义 ...