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

时间:2010-05-25 16:03:32

标签: java servlets java-ee servlet-filters

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

4 个答案:

答案 0 :(得分:27)

在webapp启动期间,始终按照web.xml中定义的顺序初始化过滤器。

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

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>mypackage.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

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

答案 3 :(得分:-1)

当心。我一直在见证同一个实例上的Filter.init()和Filter.doFilter()的并发调用。我仍感到震惊,无法恢复。它&#39;名字是Jetty。