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配置
1 <web-app> 2 <!-- servlet实例 --> 3 <servlet> 4 <servlet-name>servlet</servlet-name> 5 <servlet-class>study.myServlet.Servlet</servlet-class> 6 <load-on-startup>1</load-on-startup> 7 </servlet> 8 <servlet-mapping> 9 <servlet-name>servlet</servlet-name> 10 <url-pattern>/hello</url-pattern> 11 </servlet-mapping> 12 </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配置文件
1 <filter> 2 <filter-name>Filter</filter-name> 3 <filter-class>study.myFilter.Filter</filter-class> 4 <!-- 过滤参数 --> 5 <init-param> 6 <param-name>includeString</param-name> 7 <param-value>.do;.jsp</param-value> 8 </init-param> 9 </filter> 10 <filter-mapping> 11 <filter-name>Filter</filter-name> 12 <url-pattern>/*</url-pattern> 13 </filter-mapping>
Filter1.java
1 import javax.servlet.Filter; 2 import javax.servlet.FilterChain; 3 import javax.servlet.FilterConfig; 4 import javax.servlet.ServletException; 5 import javax.servlet.ServletRequest; 6 import javax.servlet.ServletResponse; 7 import javax.servlet.http.HttpServletRequest; 8 9 public class Filter implements Filter { 10 private FilterConfig Config; 11 12 13 public void init(FilterConfig filterConfig) throws ServletException { 14 Config = filterConfig; 15 System.out.println("1过滤器初始化成功"); 16 } 17 18 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 19 HttpServletRequest hrequest = (HttpServletRequest) servletRequest; 20 21 //过滤资源后缀参数,获取web.xml配置文件的的<param-name>includeString</param-name>的参数值value 22 String includeStrings = Config.getInitParameter("includeString"); 23 String stringList[] = includeStrings.split(";"); 24 25 //判断请求链接是否符合过滤要求的后缀 26 if(! this.isContains(hrequest.getRequestURI(),stringList)){ 27 filterChain.doFilter(servletRequest,servletResponse); 28 System.out.println("1执行过滤失败"); 29 return; 30 } 31 System.out.println("1执行过滤成功"); 32 } 33 34 //判断是否存在符合的后缀 35 public static boolean isContains(String container, String[] regx) { 36 boolean result = false; 37 38 for (int i = 0; i < regx.length; i++) { 39 if (container.indexOf(regx[i]) != -1) { 40 return true; 41 } 42 } 43 return result; 44 } 45 46 public void destroy() { 47 System.out.println("1销毁过滤器"); 48 } 49 }
有了Filter拦截器,web服务器在每次调用资源之前都会执行一遍doFilter()方法,web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
Filter的拦截匹配模式xml配置:
1 <filter-mapping> 2 <filter-name>Filter</filter-name> 3 <url-pattern>/*</url-pattern><!-- 拦截所有请求 --> 4 </filter-mapping> 5 6 <!-- 匹配后缀名 --> 7 <filter-mapping> 8 <filter-name>Filter</filter-name> 9 <url-pattern>*.jsp</url-pattern> 10 <url-pattern>*.do</url-pattern> 11 <url-pattern>*.html</url-pattern> 12 </filter-mapping> 13 14 <!-- 根目录请求路径过滤 --> 15 <filter-mapping> 16 <filter-name>Filter</filter-name> 17 <url-pattern>/kk/hello</url-pattern> 18 <url-pattern>/kk/*</url-pattern> 19 </filter-mapping> 20 21 <!-- 匹配单一路径--> 22 <filter-mapping> 23 <filter-name>Filter</filter-name> 24 <url-pattern>/hello.html</url-pattern> 25 </filter-mapping>