Spring Boot注册Web三大组件(Servlet、Filter、Listener)

介绍

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通过这种注解方式可以很方便地注册组件到容器中。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值