Listener、Filter、Servlet都有一个初始化的过程,对应的方法分别为:
contextInitialized(ServletContextEvent arg0)
init(FilterConfig filterConfig)
init(ServletConfig config)
那么它们的初始化顺序是什么呢?
Listener > Filter > Servlet
TestServlet.java
- package com.cos;
-
import java.io.IOException;
-
import javax.servlet.GenericServlet;
-
import javax.servlet.ServletConfig;
-
import javax.servlet.ServletException;
-
import javax.servlet.ServletRequest;
-
import javax.servlet.ServletResponse;
-
-
public class TestServlet extends GenericServlet {
-
@Override
-
public void init(ServletConfig config){
-
System.out.println("Servlet 初始化 。。。");
- }
-
@Override
-
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
-
System.out.println("Servlet service 。。。");
- }
- }
package com.cos;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestServlet extends GenericServlet {
@Override
public void init(ServletConfig config){
System.out.println("Servlet 初始化 。。。");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("Servlet service 。。。");
}
}
TestFilter.java
- package com.cos;
-
import java.io.IOException;
-
import javax.servlet.Filter;
-
import javax.servlet.FilterChain;
-
import javax.servlet.FilterConfig;
-
import javax.servlet.ServletException;
-
import javax.servlet.ServletRequest;
-
import javax.servlet.ServletResponse;
-
-
public class TestFilter implements Filter{
-
public void init(FilterConfig filterConfig) throws ServletException {
-
System.out.println("Filter 初始化。。。");
- }
-
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
-
System.out.println("doFilter 。。。");
- chain.doFilter(request, response);
- }
-
public void destroy() {
-
System.out.println("Filter 销毁。。。");
- }
- }
package com.cos;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter 初始化。。。");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("doFilter 。。。");
chain.doFilter(request, response);
}
public void destroy() {
System.out.println("Filter 销毁。。。");
}
}
TestListener.java
- package com.cos;
-
import javax.servlet.ServletContextEvent;
-
import javax.servlet.ServletContextListener;
-
-
public class TestListener implements ServletContextListener{
-
public void contextInitialized(ServletContextEvent arg0) {
-
System.out.println("Listener 初始化。。。");
- }
-
public void contextDestroyed(ServletContextEvent arg0) {
-
System.out.println("Listener 销毁。。。");
- }
- }
package com.cos;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TestListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("Listener 初始化。。。");
}
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("Listener 销毁。。。");
}
}
web.xml
- <?xml version="1.0" encoding="UTF-8"?>
-
<web-app version="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/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
-
<servlet>
-
<servlet-name>s</servlet-name>
-
<servlet-class>com.cos.TestServlet</servlet-class>
-
</servlet>
-
<servlet-mapping>
-
<servlet-name>s</servlet-name>
-
<url-pattern>/login</url-pattern>
-
</servlet-mapping>
-
<filter>
-
<filter-name>f</filter-name>
-
<filter-class>com.cos.TestFilter</filter-class>
-
</filter>
-
<filter-mapping>
-
<filter-name>f</filter-name>
-
<url-pattern>/*</url-pattern>
-
</filter-mapping>
-
<listener>
-
<listener-class>com.cos.TestListener</listener-class>
-
</listener>
-
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="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/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>s</servlet-name>
<servlet-class>com.cos.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<filter>
<filter-name>f</filter-name>
<filter-class>com.cos.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>f</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.cos.TestListener</listener-class>
</listener>
</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, filter 等在初始化时会用到这些上下文中的信息,因此 context-param 配置节的加载顺序非常重要。 实际上,web.xml 文件的加载顺序是:context-param -> listener -> filter -> servlet。这意味着...
通常JavaWeb项目启动时我们需要... 下面代码是模拟初始化的一个示例,可以在控制台看到程序的输出,和Listener、Filter、Servlet的启动先后顺序,强烈建议跟我一样喜欢动手的Coder操作一下,废话不多说,直接上代码了。
+ ServletConfig :定义了在 Servlet 初始化的过程中由 Servlet 容器传递给 Servlet 的配置信息对象。 + ServletContext :定义 Servlet 使用的方法以获取其容器的信息 + ServletRequest :定义一个对象封装客户...
在Java Web应用开发中,`web.xml`文件是整个Web应用程序的核心配置文件之一,它定义了Servlet容器如何启动、初始化以及配置各个组件如servlet、filter、listener等。了解这些组件之间的加载顺序对于正确配置和优化...
监听器是实现特定`java.util.EventListener`接口的类,它们可以监听应用程序中的特定事件,如会话创建、销毁、请求初始化等。在`web.xml`中,监听器通过`<listener>`标签定义。它们是最早被加载的组件,因为它们...
1. `init(FilterConfig config)`: 初始化Filter,与Servlet的`init()`类似。 2. `doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`: 过滤链的核心方法,处理请求和响应。`...
Servlet生命周期包括初始化、服务、销毁三个阶段,开发者可以通过重写`init()`、`service()`和`destroy()`方法进行定制化处理。 接着,我们来看`Filter`。Filter是Java Servlet规范中的一个重要组成部分,允许...
在`web.xml`中,使用`ContextLoaderListener`来初始化Spring的WebApplicationContext,确保在Filter执行之前Spring的上下文已经被加载。配置如下: ```xml <param-name>contextConfigLocation <param-value>/...
Web服务器中的三大组件,即Servlet、Filter和Listener,是构建动态Web应用程序的关键元素。这些组件都是基于Java的,主要用于增强和扩展Web服务器的功能。 Servlet是Java中用于处理HTTP请求的核心组件,它是动态...
按照配置顺序,先执行Listener,然后是Filter,接着是Struts拦截器,最后是Servlet。 - Filter的执行顺序取决于它们在web.xml中的配置顺序。每个Filter的doFilter()方法会被调用,直到请求达到Servlet,或者在...
- **执行顺序**:Filter的执行遵循配置顺序,而Listener的执行依赖于事件的发生顺序。 - **应用场景**:Filter更适合用于处理请求的前置和后置操作,如权限检查、编码转换等;而Listener适用于监听和响应Web应用的...
例如,如果Filter中需要使用到Bean,但是加载顺序是先加载Filter后加载Bean,则Filter中初始化操作中的Bean将为null。 通过对web.xml文件的分析,我们可以得出结论:Listener的加载顺序在最前面,接着是Filter,...
servlet的配置与filter类似,servlet的初始化顺序和映射URL的处理顺序也是根据servlet和servlet-mapping在文件中的顺序来确定的。 web.xml文件中的主要元素如下: 1. `<web-app>`:这是web.xml的根元素,包含所有...
3. **Listener**: 在监听器的初始化方法(如contextInitialized())中,可以获取ApplicationContext并注入所需的bean。 对于SSH整合,Spring还提供了Struts的Spring插件,它可以自动将ActionForm转换为Spring管理的...
而ServletContextListener则是在应用启动和关闭时执行初始化和清理工作,如加载配置信息或注册全局对象。 Filter(过滤器)则是Java Web开发中的另一个核心组件,它允许我们在请求处理前后对数据进行拦截和修改。...
4. `ServletConfig`:在Servlet初始化时由容器提供,包含关于Servlet的配置信息。 5. `ServletRequest`:代表客户端的请求,提供获取请求参数和头信息的方法。 6. `ServletResponse`:用于向客户端发送响应,可以...
8. **Listener**:Servlet 2.3引入了各种监听器接口,如ServletRequestListener、ServletRequestAttributeListener、HttpSessionListener等,可以在特定事件发生时执行代码,如Servlet初始化、请求属性改变、会话...
监听器是Servlet API中的一种重要组件,可以监听特定事件,比如Session的创建、销毁,Context的初始化、销毁,或者特定Servlet的初始化和销毁等。通过实现不同的接口,开发者可以在事件发生时执行相应的代码。 七、...
- Listener接口如ServletContextListener、ServletRequestListener等,可以在特定事件(如Web应用启动、Servlet初始化)发生时执行代码。 八、多线程与线程安全 Servlet API默认为每个请求创建一个新的线程,因此...
7. **监听器**(Listener):监听Web应用中特定事件,如会话创建、销毁、上下文初始化等,可执行相应操作。 Servlet容器模型的另一个关键特性是多线程模型。由于HTTP请求是无状态的,Servlet容器通常为每个请求创建...