Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到Servlet、Filter、Listener、Interceptor 等等。
当使用Spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet、Filter和Servlet规范的所有监听器(如HttpSessionListener监听器)。
Spring boot 的主 Servlet 为 DispatcherServlet,其默认的url-pattern为“/”。也许我们在应用中还需要定义更多的Servlet。
在spring boot中添加自己的Servlet有两种方法,代码注册Servlet和注解自动注册(Filter和Listener也是如此)。
一、代码注册通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 获得控制。
也可以通过实现 ServletContextInitializer 接口直接注册。
二、在 SpringBootApplication 上使用@ServletComponentScan注解后,Servlet、Filter、Listener 可以直接通过 @WebServlet、@WebFilter、@WebListener 注解自动注册,无需其他代码。
注解Servlet
1import javax.servlet.ServletException; 2import javax.servlet.annotation.WebServlet; 3import javax.servlet.http.HttpServlet; 4import javax.servlet.http.HttpServletRequest; 5import javax.servlet.http.HttpServletResponse; 6 7@WebServlet(urlPatterns="/myServlet2/*", description="Servlet的说明") 8public class MyServlet2 extends HttpServlet{ 9 10 private static final long serialVersionUID = 1L; 11 12 @Override 13 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 14 System.out.println(">>>>>>>>>>doGet()<<<<<<<<<<<"); 15 doPost(req, resp); 16 } 17 18 @Override 19 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 20 System.out.println(">>>>>>>>>>doPost()<<<<<<<<<<<"); 21 resp.setContentType("text/html"); 22 PrintWriter out = resp.getWriter(); 23 out.println("<html>"); 24 out.println("<head>"); 25 out.println("<title>Hello World</title>"); 26 out.println("</head>"); 27 out.println("<body>"); 28 out.println("<h1>这是:myServlet2</h1>"); 29 out.println("</body>"); 30 out.println("</html>"); 31 } 32}
注解式过滤器
1import javax.servlet.Filter; 2import javax.servlet.FilterChain; 3import javax.servlet.FilterConfig; 4import javax.servlet.ServletException; 5import javax.servlet.ServletRequest; 6import javax.servlet.ServletResponse; 7import javax.servlet.annotation.WebFilter; 8 9/** 10 * 11 * 使用注解标注过滤器 12 * @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器 13 * 属性filterName声明过滤器的名称,可选 14 * 属性urlPatterns指定要过滤的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性) 15 */ 16@WebFilter(filterName="myFilter",urlPatterns="/*") 17publicclass MyFilter implements Filter{ 18 19 @Override 20 publicvoid init(FilterConfig config) throws ServletException { 21 System.out.println("过滤器初始化"); 22 } 23 24 25 @Override 26 publicvoid doFilter(ServletRequest request, ServletResponse response, 27 FilterChain chain) throws IOException, ServletException { 28 System.out.println("执行过滤操作"); 29 chain.doFilter(request, response); 30 } 31 32 @Override 33 publicvoid destroy() { 34 System.out.println("过滤器销毁"); 35 } 36}
注解式监听器
1import javax.servlet.ServletContextEvent; 2import javax.servlet.ServletContextListener; 3import javax.servlet.annotation.WebListener; 4 5/** 6 * 使用@WebListener注解,实现ServletContextListener接口 7 * 8 * @author Angel(QQ:412887952) 9 * @version v.0.1 10 */ 11@WebListener 12public class MyServletContextListener implements ServletContextListener { 13 14 @Override 15 public void contextDestroyed(ServletContextEvent arg0) { 16 System.out.println("ServletContex销毁"); 17 } 18 19 @Override 20 public void contextInitialized(ServletContextEvent arg0) { 21 System.out.println("ServletContex初始化"); 22 } 23}
监听Session的创建与销毁
1import javax.servlet.annotation.WebListener; 2import javax.servlet.http.HttpSessionEvent; 3import javax.servlet.http.HttpSessionListener; 4 5/** 6 * 监听Session的创建与销毁 7 * 8 */ 9@WebListener 10public class MyHttpSessionListener implements HttpSessionListener { 11 12 @Override 13 publicvoid sessionCreated(HttpSessionEvent se) { 14 System.out.println("Session 被创建"); 15 } 16 17 @Override 18 publicvoid sessionDestroyed(HttpSessionEvent se) { 19 System.out.println("ServletContex初始化"); 20 } 21 22}
注意不要忘记在 SpringBootSampleApplication.java 上添加 @ServletComponentScan 注解。
启动的过程中我们会看到输出:
ServletContex初始化
过滤器初始化
服务启动后,随便访问一个页面,会看到输出:
执行过滤操作
Session 被创建