在一般的運用開發中Controller已經大部分都能夠實現了,但是也不排除需要自己實現Servlet,Filter,Listener的方式,SpringBoot提供了三種實現方式。
1. 使用Bean的實現方式
首先創建一個Servlet,一個Filter,一個Listener,
DemoServlet.java
package com.wangx.boot.util.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class DemoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get method"); doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post method"); resp.getWriter().write("hello world"); } }
DemoFilter.java
package com.wangx.boot.util.filter; import javax.servlet.*; import java.io.IOException; public class DemoFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("開始攔截了...."); } @Override public void destroy() { } }
DemoListener.java
package com.wangx.boot.util.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class DemoListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("contextInitialized"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("contextDestroyed"); } }
然后直接在SpringBoot的啟動類中將上面幾個方法注冊為Bean,
SpringBootDemo01Application.java
package com.wangx.boot; import com.wangx.boot.util.filter.DemoFilter; import com.wangx.boot.util.listener.DemoListener; import com.wangx.boot.util.servlet.DemoServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; @SpringBootApplication public class SpringBootDemo01Application { /** * 注冊Servlet * @return */ @Bean public ServletRegistrationBean createServlet () { //第二個參數為urlPartern return new ServletRegistrationBean(new DemoServlet(), "/demoServlet"); } /** * 注冊Filter * @return */ @Bean public FilterRegistrationBean createFilter() { //第二個參數為需要攔截的路徑,不傳則攔截所有 return new FilterRegistrationBean(new DemoFilter(), createServlet()); } /** * 注冊Listener * @return */ @Bean public ServletListenerRegistrationBean createrListener() { //自定義個Listener.監聽整個Context的Servlet return new ServletListenerRegistrationBean(new DemoListener()); } public static void main(String[] args) { SpringApplication.run(SpringBootDemo01Application.class, args); } }
啟動項目時會Listener會打印contextInitialized,關閉時會打印contextDestroyed,訪問時攔截器打印"開始攔截了....",並成功訪問到Servlet,並輸入hello world到瀏覽器上。
2. 實現ServletContextInitializer接口
直接在SpringBoot的啟動類中實現ServletContextInitializer,重寫onStartup()方法也可以使用Servlet.Filter,Listener,以上面三個Demo類為例,使用ServletContextInitializer的方式的代碼:
package com.wangx.boot; import com.wangx.boot.util.filter.DemoFilter; import com.wangx.boot.util.listener.DemoListener; import com.wangx.boot.util.servlet.DemoServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletContextInitializer; import javax.servlet.DispatcherType; import javax.servlet.ServletContext; import javax.servlet.ServletException; import java.util.EnumSet; @SpringBootApplication public class SpringBootDemo01Application implements ServletContextInitializer { public static void main(String[] args) { SpringApplication.run(SpringBootDemo01Application.class, args); } @Override public void onStartup(ServletContext servletContext) throws ServletException { //創建Servlet,並映射訪問路徑為demoServlet servletContext.addServlet("demoServlet", new DemoServlet()).addMapping("/demoServlet"); //創建Filter,攔截的Servlet servletContext.addFilter("demoFilter", new DemoFilter()).addMappingForServletNames(EnumSet.of(DispatcherType.FORWARD), true, "demoServlet"); //創建Listener servletContext.addListener(new DemoListener()); } }
運行結果與1相同
3. 使用注解的方式
這是一個SpringBoot官方推薦的方式,也是三種方式中最簡單的方式,只需要在SpringBoot的啟動類上添加@ServletComponentScan注解,在DemoServlet類上添加@WebServlet(name = "demoServlet", urlPatterns = "/demoServlet")注解,DemoFilter類上添加@WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.FORWARD)(攔截所有請求),DemoListener類上添加@WebListener即可,運行結果與1相同。