Servlet.init()和Filter.init()调用序列

mar*_*its 31 java servlets java-ee servlet-filters

在java Web应用程序中调用的Servlet.init()和Filter.init()方法的顺序是什么?首先叫哪一个?是否所有Servlet.init()方法都被调用,而不是任何Filter.doFilter方法?

Bal*_*usC 28

始终在webapp启动期间按顺序初始化过滤器,因为它们在中定义web.xml.

默认情况下,servlet在其url-pattern上的第一个HTTP请求期间初始化.但您也可以配置它们以在webapp启动期间使用<load-on-startup>可以指定其优先级的条目进行初始化.然后将按优先顺序加载它们.
例如

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>mypackage.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)

如果有更多具有相同优先级顺序的servlet,那么这些servlet的加载顺序是未指定的,可能是任意的.但是,在过滤器初始化之后,但调用过滤器之前,Servlet会以任何方式进行初始化.


Ten*_*she 8

  1. 对于所有过滤器: Filter.init()
  2. 对于所有带''的servlet web.xml:Servlet.init()
  3. 对于请求的所有适用过滤器: Filter.doFilter()
  4. 如果适用的servlet尚未初始化: Servlet.init()
  5. 对于适用的servlet: Servlet.service()


小智 7

只是旁注 - 我在tomcat(7.0.30)上遇到过Filter.init()方法以随机顺序运行(通过HashMap迭代).