Servlet和Filter生命周期
1. 生命周期
1.1. Servlet生命周期
servlet是一个基于java技术的WEB组件,运行在服务器端,我们利用 sevlet可以很轻松的扩展WEB服务器的功能,使它满足特定的应用需要。servlet由servlet容器管理,servlet容器也叫 servlet引擎,是servlet的运行环境,给发送的请求和响应提供网络服务。
1)容器装载servlet(容器装载servlet时,会根据web.xml配置判断是否对实例初始化,否则等待http第一次请求servlet的时候,才调用init()进行初始化,并执行相应service操作)
2)创建servlet实例,并初始化对应的init()方法(仅执行一次)
3)接收客户Http请求,调用并执行相应的service()方法(doGet或doPOST),(执行多次)
4)在服务端停止服务或应用关闭时执行destroy()方法销毁servlet实例(仅执行一次)
注:如果是多线程的情况下,必须要确保所有所有线程都终止。

测试源码Servlet.java
import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Servlet extends HttpServlet{
@Override
public void init() throws ServletException {
System.out.println("我被初始化了");
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我被调用了");
} @Override
public void destroy() {
System.out.println("我被销毁了");
}
}
Web.xml配置
<web-app>
<!-- servlet实例 -->
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>study.myServlet.Servlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
1)其中配置了<load-on-startup>1</load-on-startup> 表示在容器启动的时候就实例化该servlet,其中的数字越小表示启动优先级别越高,
2)servlet的生命周期的销毁顺序和启动顺序相反。
1.2. Filter生命周期
Filter(拦截器)主要对web服务器所管理的所有资源(包括:JSP,Servlet,静态图片)进行拦截和过滤处理,如果配置了/*,表示拦截所有请求,每次请求都会先调用Filter的doFilter方法进行处理。
1)服务器启动加载过滤器实例并调用init()方法,(过滤器实例的加载优先级高于servlet)
2)每一次请求都会事先调用doFilter()进行过滤处理
3)停止服务时执行destroy()销毁过滤器
Web.xml配置文件
<filter>
<filter-name>Filter</filter-name>
<filter-class>study.myFilter.Filter</filter-class>
<!-- 过滤参数 -->
<init-param>
<param-name>includeString</param-name>
<param-value>.do;.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter1.java
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; public class Filter implements Filter {
private FilterConfig Config; public void init(FilterConfig filterConfig) throws ServletException {
Config = filterConfig;
System.out.println("1过滤器初始化成功");
} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest hrequest = (HttpServletRequest) servletRequest; //过滤资源后缀参数,获取web.xml配置文件的的<param-name>includeString</param-name>的参数值value
String includeStrings = Config.getInitParameter("includeString");
String stringList[] = includeStrings.split(";"); //判断请求链接是否符合过滤要求的后缀
if(! this.isContains(hrequest.getRequestURI(),stringList)){
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("1执行过滤失败");
return;
}
System.out.println("1执行过滤成功");
} //判断是否存在符合的后缀
public static boolean isContains(String container, String[] regx) {
boolean result = false; for (int i = 0; i < regx.length; i++) {
if (container.indexOf(regx[i]) != -1) {
return true;
}
}
return result;
} public void destroy() {
System.out.println("1销毁过滤器");
}
}
有了Filter拦截器,web服务器在每次调用资源之前都会执行一遍doFilter()方法,web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
Filter的拦截匹配模式xml配置:
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern><!-- 拦截所有请求 -->
</filter-mapping> <!-- 匹配后缀名 -->
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
<url-pattern>*.html</url-pattern>
</filter-mapping> <!-- 根目录请求路径过滤 -->
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/kk/hello</url-pattern>
<url-pattern>/kk/*</url-pattern>
</filter-mapping> <!-- 匹配单一路径-->
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/hello.html</url-pattern>
</filter-mapping>
Servlet和Filter生命周期的更多相关文章
- Servlet、Filter 生命周期
Servlet作为JavaEE必须掌握的内容,Struts2通过使用Filter的功能实现了一个MVC的框架.因此掌握这Servlet以及Filter的生命周期显得非常重要. 1. Servlet的生 ...
- Servlet生命周期 、Filter生命周期、Listering(监听器)总结
Servlet生命周期简述 (1)加载和实例化 当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求:如果不存在 ...
- Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)
该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用s ...
- Servlet配置及生命周期
1.设置Ecilipse快捷 file new 2.创建Servlet程序 1). 创建一个 Servlet 接口的实现类. public class HelloServl ...
- 面试之jsp、Servlet相关知识——生命周期, 区别等
1.servlet生命周期 所谓生命周期,指的是servlet容器如何创建servlet实例.分配其资源.调用其方法.并销毁其实例的整个过程. 阶段一: 实例化(就是创建servlet对象,调用构造器 ...
- Servlet和JSP生命周期概述
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt374 Servlet生命周期分为三个阶段: 1,初始化阶段 调用init( ...
- servlet简介及生命周期
Servlet 简介 Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上 ...
- jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
jsp当做第二个servlet request的生命周期 请求 响应 不管中间经历多少个servlet 只要最后一个serlvt执行后 则生命周期结束 request的域消失
- java Web servlet简介及其生命周期
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 我们可 ...
随机推荐
- tomcat在centos下的操作
一 .Tomcat启动与停止 进入Tomcat中bin所在目录 cd /usr/tomcat/bin 启动: ./startup.sh 停止: ./shutdown.sh 平常可以用这个命令来查看to ...
- mysql中的范式与范式——读<<高性能mysql>>笔记一
对于任何给定的数据库通常都有很多表示方法,从完全的范式化到完全的反范式化,以及两者的折中.在范式化的数据库中,每个事实数据会出现并且只出现一次.相反,在反范式化的数据库中,可能会存储在多个地方. 那什 ...
- Mysql字符串截取总结:left()、right()、substring()、substring_index()
同步首发:http://www.yuanrengu.com/index.php/20171226.html 在实际的项目开发中有时会有对数据库某字段截取部分的需求,这种场景有时直接通过数据库操作来实现 ...
- 【linux之find及awk】
一.find命令 find 精确查找,根据提供的条件或组合条件进行查找,遍历所有文件,因此速度比较慢. 语法: find 目录 条件 动作 默认目录是当前目录默认条件是所有条件默认动作是显示查找到的信 ...
- 最长周长三角形 O(nlogn)
题意 有根棍子,棍子的长度为.想要从中选出三根棍子组成周长尽可能长的三角形.请输出最大的周长,若无法组成三角形输出0. 思路 很容易想到采用三重循环来枚举所有三角形,复杂度为. 更好的办法 ...
- UVA - 12186 Another Crisis (树形DP)
思路:dp[i]表示让上司i签字至少需要多少工人签字. 转移方程:将i的所有节点根据所需工人数量升序排序,设i需要k个下属签字,dp[i] = sum{dp[v]| 0 <= v & ...
- [Code] 中缀式转后缀式
[Code] 中缀式转后缀式 概要 对于一个可带括号的中缀四则运算表达式, 例如30 + 4 / 2 或 30 / ( 4 + 2 ), 下面代码将分别转换为对应的后缀表达形式 30 4 2 / + ...
- HashMap并发导致死循环 CurrentHashMap
为何出现死循环简要说明 HashMap闭环的详细原因 cocurrentHashMap的底层机制 为何出现死循环简要说明 HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行 ...
- 【DDD】领域驱动设计实践 —— 一些问题及想法
在社区系统的DDD实践过程中,将遇到一些问题和产生的想法记录下来,共讨论. 本文为[DDD]系列文章中的其中一篇,其他内容可参考:使用领域驱动设计思想实现业务系统. 1.dto.model和entit ...
- Android shape使用详解
在android开发过程中,shape是比较常用的,用于设定控件的形状,可以在selector,layout等里面使用,有6个子标签,各属性说明如下: <?xml version="1 ...