路径扫描整合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】按钮关闭当前项目,再次查看控制台打印效果,如图4所示。
图4 自定义Listener组件关闭效果
通过上述效果演示可以看出,使用路径扫描的方式同样成功实现了Spring Boot与Servlet容器中三大组件的整合。
至此,关于Spring Boot内嵌式Servlet容器中Servlet、Filter、Listener组件的整合讲解已经完成。开发者在使用过程中,可以根据实际需求选择性的定制相关组件进行使用。