Servlet、Filter、Listener、Interceptor基础
第一:Servlet
Servlet是个接口,全限定名是javax.servlet.Servlet,在javax.servlet包中,在servlet-api.jar(在tomcat自带的lib文件夹中)或是在javax.servlet-api-xxx.jar(在maven中引入javax.servlet-api依赖)。
如果我们用IDE工具,右键new,选择Servlet的方式创建一个Servlet,则会自动继承javax.servlet.http.HttpServlet(HttpServlet类实现了Servlet接口),我们只需定义好Servlet名称、在URL mapping框中填好url pattern的值,如果有需要,还可以在Intialization parameters框中填入初始化参数的值。
此外,url pattern的值必须以斜杠"/"或者“*.”开头,如果填入的值不满足这个要求,IDE工具就会提示URL patterns should start with "/" or "*."。如果我们在创建好Servlet之后再手动把url pattern的值修改为不满足条件的值,则此项目就不能启动了,启动项目时会弹出Problem Occured错误提示框,提示 ‘Starting Tomcat v7.0 Server at localhost’ has encountered a problem,控制台也会报异常org.apache.catalina.LifecycleException:Caused
by: org.apache.catalina.LifecycleException: A child container failed during start。
Servlet的生命周期:
1.Servlet实例化
Servlet实例化有2个时机,第一种是客户端第一次请求时,系统创建对应的Servlet实例,默认是这种;第二种是系统启动后就创建Servlet实例,这种要配置load-on-startup的值,0-5的整数,0表示优先级最高,最快实例化。其实负整数也不会报错,只是不起作用,系统还是在客户端第一次请求时创建对应的Servlet实例。
2.Servlet初始化
init(ServletConfig config)方法,如果在创建Servlet类时填写了Intialization parameters,则这些值将被封装在ServletConfig实例中,并传入到init方法中。
3.Servlet处理客户端请求,service()方法。
4.Servlet销毁
系统在关闭前会调用destroy()方法销毁Servlet实例。
如何获取该servlet的配置参数?
HttpServlet的父类GenericServlet中有getServletConfig()方法,我们自己建的servlet调用父类此方法就可以得到ServletConfig实例了,然后在调用ServletConfig的实例方法getInitParameter(String name)就可以获得指定的配置参数的值了。
第二:Filter
Filter也是个接口,全限定名是javax.servlet.Filter,跟Servlet接口在同一目录下。如果配置了Filter,且请求地址满足Filter的url pattern,则请求在到达对应的Servlet之前会先到达Filter。可以有多个Filter,请求到达这些Filter的顺序是由这些Filter在web.xml文件中<url-pattern>*.action</url-pattern>配置的先后顺序决定的,从上到下匹配,先匹配到哪个Filter,请求就先到哪个Filter。因为请求会在到达Servlet之前先到达Filter,所以可以用Filter对用户请求进行预处理,之后再将请求交给Servlet处理,处理之后,再用Filter对响应进行后处理。
有2种常见用法:
1.用户鉴权Filter
接收到请求之后,看用户是否登录了或者看用户是否有对应的访问权限,如果没有,则提示登录或者提示没有权限,如果没问题,则将请求交给Servlet处理。
2.处理字符编码的Filter
设置请求与响应的字符编码为指定格式。
需要说明的是,Filter是在应用一启动的时候就实例化的,紧接着就初始化,而不像Servlet那样可以在第一次请求的时候再实例化。而且,多个Filter实例化的顺序并不一定按照在web.xml文件中配置的顺序。另外,经过实际测试发现一个现象,客户端发起一个请求,到达Filter,按道理来说应该是Filter处理完,请求到达Servlet后再实例化对应的Servlet,但实际却是只要客户端发了请求,实例化、初始化Filter之后就会实例化、初始化对应的Servlet,这时候请求还没有到达对应的Servlet。
Filter处理请求主要是用doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法,多个Filter间传递请求、最后一个Filter向Servlet传递请求都是在上述doFilter()方法中调用FilterChain接口的doFilter ( ServletRequest request, ServletResponse response )方法,如果之后再调用入参ServletResponse实例的API,则就是对响应进行后处理了。
如何获取该filter的配置参数?
不像获取servlet配置参数一样,没有现成的getFilterConfig()可供调用,但是发现Filter接口的init(FilterConfig filterConfig)方法参数竟然是FilterConfig实例,看来是把初始化参数封装到了此实例当中,如此,我们可以在filter类中创建FilterConfig类型的成员变量,在init方法中把filterConfig赋值给此成员变量,这样就可以在doFilter()方法中调用此FilterConfig类型的成员变量的getInitParameter(xxx)方法获取指定的初始化参数的值了。
第三:Listener
Listener接口分为3类:
1.监听web应用,主要用的是ServletContextListener(javax.servlet.ServletContextListener)接口,web应用的启动与关闭各触发接口的一个方法:
web应用启动触发contextInitialized(ServletContextEvent sce)方法,web应用关闭触发contextDestroyed(ServletContextEvent sce)方法。
2.监听session,主要用的是HttpSessionListener(javax.servlet.http.HttpSessionListener)接口,用户session的开始和结束各触发接口的一个方法:
session开始触发sessionCreated(HttpSessionEvent se)方法,session结束触发sessionDestroyed(HttpSessionEvent se)方法。
3.监听reqeust,主要用的是ServletRequestListener(javax.servlet.ServletRequestListener)接口,用户发起请求、请求结束时各触发接口的一个方法:
用户发起请求时触发requestInitialized(ServletRequestEvent sre)方法,请求结束时触发requestDestroyed(ServletRequestEvent sre)方法。
创建监听类,只需实现对应的xxxListener接口即可。
综上,系统启动后会先触发ServletContextListener实现类的contextInitialized()方法,再实例化、初始化所有的Filter实现类,再实例化、初始化所有配置了load-on-startup的Servlet,用户发起请求后,先实例化、初始化对应的Servlet,然后符合请求条件的Filter链预处理请求之后传给Servlet处理请求,Filter链再后处理响应,之后将响应结果展示给用户。
项目中如果用了Spring框架,为了让web应用在启动时就创建IOC容器,需要在web.xml文件中配置一个监听器,监听器类是spring-web-xxx.jar包中的ContextLoaderListener(org.springframework.web.context.ContextLoaderListener,实现了ServletContextListener接口),并且还要为此类配置一个web应用配置参数。
<!-- 配置监听器ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<!-- 参数名必须是contextConfigLocation -->
<param-name>contextConfigLocation</param-name>
<!-- 参数值是配置文件的名字 -->
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
第四:Interceptor
Interceptor,拦截器,在spring mvc框架中也有较多的应用。
在spring-webmvc-xxx.jar中有一个HandlerInterceptor接口,有一个常用的实现类HandlerInterceptorAdapter,我们既可以直接实现HandlerInterceptor接口也可以继承HandlerInterceptorAdapter类,不论是实现接口还是继承实现类,都需要重写里面的几个方法(preHandle、postHandle、afterCompletion方法),来实现自己的需求。
除了HandlerInterceptor接口外,在spring-web-xxx.jar包中还有一个WebRequestInterceptor接口,该接口及其实现类WebRequestHandlerInterceptorAdapter也是可以用的。
Servlet、Filter、Listener、Interceptor基础的更多相关文章
- servlet filter listener interceptor 知识点
这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下: 概念 生命周期 使命 servlet ...
- servlet/filter/listener/interceptor区别与联系
转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...
- 【转】servlet/filter/listener/interceptor区别与联系
原文:https://www.cnblogs.com/doit8791/p/4209442.html 一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台 ...
- [转]web.xml中servlet ,filter ,listener ,interceptor的作用与区别
原文链接:https://blog.csdn.net/netdevgirl/article/details/51483273 一.概念: 1.servlet:servlet是一种运行服务器端的java ...
- servlet & filter & listener & interceptor
web.xml 的加载顺序是:context- param -> listener -> filter -> servlet * Servlet 对URL生效,用户处理用户的URL请 ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference
- SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式
在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...
- ServletContextInitializer添加 servlet filter listener
ServletContextInitializer添加 servlet filter listener https://www.cnblogs.com/pomer-huang/p/9639322.ht ...
- SpringBoot---注册Servlet,Filter,Listener
1.概述 1.1.当使用 内嵌的Servlet容器(Tomcat.Jetty等)时,将Servlet,Filter,Listener 注册到Servlet容器的方法: 1.1.1.直接注册Bean ...
- filter listener interceptor的区别
转自: http://www.cnblogs.com/shangxiaofei/p/5328377.html https://www.cnblogs.com/jinb/p/6915351.html 一 ...
随机推荐
- 元素的BFC特性与自适应布局
一.BFC元素简介与基本表现. BFC全程"Block Formatting Context",中文为"块级格式化上下文".记住一句话:BFC元素特性表现原则就 ...
- Debian7安装php5.5/5.6
### 1 添加源 echo "deb http://packages.dotdeb.org wheezy-php56 all" >> /etc/apt/sources ...
- setAction方法 Snackbar 右侧按钮可以被点击并处理一些事件
从数据库同一记录取得的字段所组装成的对象应该是同一个对象,然后由不同的Session从数据库同一条记录上分别取得对象,它们的内存地址是不一样的. 一般来说,常见的数字加密方式都可以分为两类,即对称加密 ...
- .net中读取xml文件中节点的所有属性信息
功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...
- hbase自带mapreduce计数表行数功能
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘tablename’ mapreduce来计数,很快的!!!
- BCTF Web Code–考脑洞,你能过么?
BCTF Web Code–考脑洞,你能过么? 1)打开链接,是一张图片 根据URL特点推断可能是有文件包含漏洞 2) 将jpg参数修改成index.php,查看源代码,发现base64编码后的代码 ...
- 拔高课程_day14_课堂笔记
今日大纲 Redis的持久化 Redis的主从 Redis的集群 mysql 优化 tomcat优化 Redis的持久化 持久化 持久化,就是将数据保存到磁盘,机器宕机或者重启数据不丢失,如果存储到内 ...
- 淘淘商城_day11_课堂笔记
今日大纲 发布前的准备 实施发布 一部分是由我来发布 一部分是由你们来发布 讲解分布式部署架构 测试 功能测试 压力测试 项目实战的准备以及分组 分组 抽取功能 讲解所需要开发的功能 项目部署上线流程 ...
- mysql 初始化修改密码问题(Mac系统)
今天公司大牛帮我搞定了mysql初始化密码问题,纪录一下: ~ ps aux | grep mysqlMetro 7149 0.0 0.0 2432772 564 s000 R+ 7:16下午 0:0 ...
- 简单的interface显式和隐式的实现
一,新建接口 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// < ...