Web開發使用 Controller 基本上可以完成大部分需求,但是我們還可能會用到 Servlet、Filter、Listener、Interceptor 等等。
當使用spring-Boot時,嵌入式Servlet容器通過掃描注解的方式注冊Servlet、Filter和Servlet規范的所有監聽器(如HttpSessionListener監聽器)。
Spring boot 的主 Servlet 為DispatcherServlet,其默認的url-pattern為“/”。也許我們在應用中還需要定義更多的Servlet,該如何使用SpringBoot來完成呢?
在spring boot中添加自己的Servlet有兩種方法,代碼注冊Servlet和注解自動注冊(Filter和Listener也是如此)。
一、代碼注冊通過ServletRegistrationBean、 FilterRegistrationBean 和ServletListenerRegistrationBean 獲得控制。
也可以通過實現 ServletContextInitializer 接口直接注冊。
二、在SpringBootApplication 上使用@ServletComponentScan注解后,Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 注解自動注冊,無需其他代碼。
1.通過代碼注冊Servlet示例代碼:
package me.shijunjie.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet1 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(">>>>>>>>>>doGet()<<<<<<<<<<<"); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(">>>>>>>>>>doPost()<<<<<<<<<<<"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>HelloWorld</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>這是:MyServlet1</h1>"); out.println("</body>"); out.println("</html>"); } }
package me.shijunjie.testspringboot2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import me.shijunjie.servlet.MyServlet1; @SpringBootApplication public class App { /** * 注冊Servlet.不需要添加注解:@ServletComponentScan * @return */ @Bean public ServletRegistrationBean myServlet1(){ return new ServletRegistrationBean(new MyServlet1(),"/myServlet/*"); } public static void main( String[] args ) { SpringApplication.run(App.class, args); } }
測試
2.使用注解注冊Servlet示例代碼 添加@WebServlet注解
package me.shijunjie.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns="/myServlet2/*",description="Servlet的說明") public class MyServlet2 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(">>>>>>>>>>doGet()<<<<<<<<<<<"); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(">>>>>>>>>>doPost()<<<<<<<<<<<"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>HelloWorld</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>這是:MyServlet2</h1>"); out.println("</body>"); out.println("</html>"); } }
添加@ServletComponentScan注解
package me.shijunjie.testspringboot2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; /** * Hello world! * */ @SpringBootApplication @ServletComponentScan("me.shijunjie.servlet") public class App { /* *//** * 注冊Servlet.不需要添加注解:@ServletComponentScan * @return *//* @Bean public ServletRegistrationBean myServlet1(){ return new ServletRegistrationBean(new MyServlet1(),"/myServlet/*"); }*/ public static void main( String[] args ) { SpringApplication.run(App.class, args); } }
測試