学科分类
目录
Spring Boot开发

路径扫描整合Servlet三大组件

在Spring Boot中,使用路径扫描的方式整合内嵌式Servlet容器的Servlet、Filter、Listener三大组件时,首先需要在自定义组件上分别添加@WebServlet、@WebFilter和@WebListener注解进行声明,并配置相关注解属性,然后在项目主程序启动类上使用@ServletComponentScan注解开启组件扫描即可。

1. 使用路径扫描方式整合Servlet、Filter、Listener

为了简化操作,在上一小节自定义组件的基础上使用路径扫描的方式实现Servlet容器的Servlet、Filter、Listener三大组件的整合。为了避免与之前编写的使用组件注册的方式相互干扰,先将之前自定义的Servlet组件配置类ServletConfig全部注释,同时注释掉自定义Servlet、Filter、Listener三大组件类上的@Component注解。

对之前自定义组件进行修改。使用@WebServlet、@WebFilter和@WebListener注解及对应属性对自定义组件进行组件定制,修改后的Servlet、Filter、Listener组件主要内容分别如文件1、2和3所示。

文件1 MyServlet.java

 1    /**
 2     * 自定义Servlet类
 3    */
 4    @WebServlet("/annotationServlet")
 5    //@Component
 6    public class MyServlet extends HttpServlet {
 7        @Override
 8        protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
 9                                                        throws ServletException, IOException {
 10            this.doPost(req, resp);
 11        }
 12        @Override
 13        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
 14                                                         throws ServletException, IOException {
 15            resp.getWriter().write("hello MyServlet");
 16        }
 17    }

文件2 MyFilter.java

 1    /**
 2     *  自定义Filter类
 3     */
 4    @WebFilter(value = {"/antionLogin","/antionMyFilter"})
 5    //@Component
 6    public class MyFilter implements Filter {
 7        @Override
 8        public void init(FilterConfig filterConfig) throws ServletException {   }
 9        @Override
 10        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
 11                                FilterChain filterChain) throws IOException, ServletException {
 12            System.out.println("hello MyFilter");
 13            filterChain.doFilter(servletRequest,servletResponse);
 14        }
 15        @Override
 16        public void destroy() {   }
 17    }

文件3 MyListener.java

 1    /**
 2     *  自定义Listener类
 3    */
 4    @WebListener
 5    //@Component
 6    public class MyListener implements ServletContextListener {
 7        @Override
 8        public void contextInitialized(ServletContextEvent servletContextEvent) {
 9            System.out.println("contextInitialized ...");
 10        }
 11        @Override
 12        public void contextDestroyed(ServletContextEvent servletContextEvent) {
 13            System.out.println("contextDestroyed ...");
 14        }
 15    }

文件1、2和3中,分别自定义了Servlet、Filter、Listener组件。在对应组件上分别使用@WebServlet("/annotationServlet")注解来映射“/annotationServlet”请求的Servlet类,使用@WebFilter(value = {"/antionLogin","/antionMyFilter"})注解来映射“/antionLogin”和“/antionMyFilter”请求的Filter类,使用@WebListener注解来标注Listener类。

使用相关注解配置好自定义Servlet、Filter、Listener三大组件后,在项目主程序启动类上添加@ServletComponentScan注解开启基于注解方式的Servlet组件扫描支持,内容如文件4所示。

文件4 Chapter05Application.java

 1    import org.springframework.boot.SpringApplication;
 2    import org.springframework.boot.autoconfigure.SpringBootApplication;
 3    import org.springframework.boot.web.servlet.ServletComponentScan;
 4    @SpringBootApplication
 5    @ServletComponentScan  // 开启基于注解方式的Servlet组件扫描支持
 6    public class Chapter05Application {
 7        public static void main(String[] args) {
 8            SpringApplication.run(Chapter05Application.class, args);
 9        }
 10    }

2. 效果测试

启动项目,项目启动成功后查看控制台打印效果,效果如图1所示。

图1 自定义Listener组件初始化效果

在浏览器上访问“http://localhost:8080/annotationServlet”,效果如图2所示。

图2 自定义Servlet组件访问效果

在浏览器上访问“http://localhost:8080/antionMyFilter”查看控制台打印效果,如图3所示。

图3 自定义Filter组件访问效果

​ 单击IDEA工具控制台左侧的【Exit】按钮img关闭当前项目,再次查看控制台打印效果,如图4所示。

图4 自定义Listener组件关闭效果

通过上述效果演示可以看出,使用路径扫描的方式同样成功实现了Spring Boot与Servlet容器中三大组件的整合。

​ 至此,关于Spring Boot内嵌式Servlet容器中Servlet、Filter、Listener组件的整合讲解已经完成。开发者在使用过程中,可以根据实际需求选择性的定制相关组件进行使用。

点击此处
隐藏目录