介绍
Servlet、Filter、Listener是JavaEE Web服务规定的服务器动态组件,由Web容器创建,并保证单例以及线程安全性。其中加载顺序为Listener–>Filter–>Servlet。
在Servlet 3.0 后开始有对应的注解用于注册这三个组件,分别是:
- @WebServlet用于Servlet注册
- @WebFilter用于Filter注册
- @WebListener用于Listener注册
下面来看看在Spring Boot中如何使用这些注解来整合这三个组件
注册Servlet示例
这里的自定义Servlet类上的注解@WebServlet(urlPatterns = “/myServlet”),也可以写成@WebServlet(urlPatterns = {"/myServlet"})或@WebServlet("/myServlet")。
@WebServlet(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问了myServlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
学习资源链接:
Servlet中@WebServlet属性详解
JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)
注册Filter示例
创建一个类实现Filter接口,加上注解@WebFilter(urlPatterns = “/myServlet”),定义过滤的请求路径为/myServlet。
@WebFilter(urlPatterns = "/myServlet")
public class MyFilter implements Filter {
/*
程序启动时,web容器就会调用init方法。不用等到调用与被过滤器相关的资源之后,
就调用了init方法。这个方法只调用一次。
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化MyFilter拦截器");
}
/*
每次调用与过滤器相关的资源时,web容器都会调用Filter实例的doFilter方法。
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入MyFilter拦截器");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("通过MyFilter拦截器");
}
/*
这个方法在过滤器即将终止服务之前,由web容器调用,一般发生在应用程序停止的时候。
*/
@Override
public void destroy() {
System.out.println("销毁MyFilter拦截器");
}
}
学习资源链接:
Java三大器之过滤器(Filter)的工作原理和代码演示
注册Listener示例
servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:
- 第一类:与servletContext有关的listner接口。包括:ServletContextListener、ServletContextAttributeListener
- 第二类:与HttpSession有关的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener;
- 第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
下面实现两个常用的接口:
创建一个类实现ServletRequestListener接口,用于监听ServletRequest对象的创建和销毁,加上注解@WebListener。
@WebListener
public class MyListener implements ServletRequestListener {
/*
请求销毁时调用
*/
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("请求销毁");
}
/*
请求发送调用
*/
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("请求发送");
}
}
创建一个类实现ServletContextListener接口,监听ServletContext的创建和销毁。实际上是监听 Web 应用的生命周期,加上注解@WebListener。
@WebListener
public class MyListener2 implements ServletContextListener {
/**
* 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
* 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("调用MyListener2");
}
/**
* 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("销毁MyListener2");
}
}
学习资源链接:
Java三大器之监听器(Listener)的工作原理和代码演示servlet/filter/listener/interceptor区别与联系
添加注解
在启动类中添加注解@ServletComponentScan,指定要扫描的包,这样就会自动注册这三个组件。
@SpringBootApplication
@ServletComponentScan(basePackages = "com.learn.webcomponent")
public class WebcomponentApplication {
public static void main(String[] args) {
SpringApplication.run(WebcomponentApplication.class, args);
}
}
启动项目,浏览器中输入http://localhost:8080/myServlet 访问,查看后台输出信息:
可以看到Spring Boot通过这种注解方式可以很方便地注册组件到容器中。