Listener、Filter、Servlet的初始化顺序

Listener、Filter、Servlet都有一个初始化的过程,对应的方法分别为:

contextInitialized(ServletContextEvent arg0)

init(FilterConfig filterConfig)

init(ServletConfig config)

那么它们的初始化顺序是什么呢?

Listener > Filter > Servlet

TestServlet.java

Java代码
  1. importjava.io.IOException;
  2. importjavax.servlet.GenericServlet;
  3. importjavax.servlet.ServletConfig;
  4. importjavax.servlet.ServletException;
  5. importjavax.servlet.ServletRequest;
  6. importjavax.servlet.ServletResponse;
  7. publicclassTestServletextendsGenericServlet{
  8. @Override
  9. publicvoidinit(ServletConfigconfig){
  10. System.out.println("Servlet初始化。。。");
  11. }
  12. @Override
  13. publicvoidservice(ServletRequestarg0,ServletResponsearg1)throwsServletException,IOException{
  14. System.out.println("Servletservice。。。");
  15. }
  16. }

TestFilter.java

Java代码
  1. importjava.io.IOException;
  2. importjavax.servlet.Filter;
  3. importjavax.servlet.FilterChain;
  4. importjavax.servlet.FilterConfig;
  5. importjavax.servlet.ServletException;
  6. importjavax.servlet.ServletRequest;
  7. importjavax.servlet.ServletResponse;
  8. publicclassTestFilterimplementsFilter{
  9. publicvoidinit(FilterConfigfilterConfig)throwsServletException{
  10. System.out.println("Filter初始化。。。");
  11. }
  12. publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{
  13. System.out.println("doFilter。。。");
  14. chain.doFilter(request,response);
  15. }
  16. publicvoiddestroy(){
  17. System.out.println("Filter销毁。。。");
  18. }
  19. }

TestListener.java

Java代码
  1. importjavax.servlet.ServletContextEvent;
  2. importjavax.servlet.ServletContextListener;
  3. publicclassTestListenerimplementsServletContextListener{
  4. publicvoidcontextInitialized(ServletContextEventarg0){
  5. System.out.println("Listener初始化。。。");
  6. }
  7. publicvoidcontextDestroyed(ServletContextEventarg0){
  8. System.out.println("Listener销毁。。。");
  9. }
  10. }

web.xml

Xml代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  3. <servlet>
  4. <servlet-name>s</servlet-name>
  5. <servlet-class>com.cos.TestServlet</servlet-class>
  6. </servlet>
  7. <servlet-mapping>
  8. <servlet-name>s</servlet-name>
  9. <url-pattern>/login</url-pattern>
  10. </servlet-mapping>
  11. <filter>
  12. <filter-name>f</filter-name>
  13. <filter-class>com.cos.TestFilter</filter-class>
  14. </filter>
  15. <filter-mapping>
  16. <filter-name>f</filter-name>
  17. <url-pattern>/*</url-pattern>
  18. </filter-mapping>
  19. <listener>
  20. <listener-class>com.cos.TestListener</listener-class>
  21. </listener>
  22. </web-app>

启动tomcat后,在控制台里以此打印出:

Listener 初始化。。。

Filter 初始化。。。

信息: Server startup in 675 ms

可以看出Listener的初始化最早,Filter次之。他俩的初始化都是在容器启动完成之前初始化的。

Servlet没有初始化,原因是没有匹配的请求进来。

如果想要servlet自动初始化,需要在指定的servlet中配置<load-on-startup>参数,没有此标签,默认启动时servlet不进行初始化。

初始化的顺序跟Listener、Filter、Servlet在web.xml中的顺序无关

而多个Filter或多个Servlet的时候,谁的mapping在前面,谁先初始化。

如果web.xml中配置了<context-param>,初始化顺序:

context-param > Listener > Filter > Servlet

你可能感兴趣的:(listener)