javascript
Spring Boot 注册 Servlet 的3种方式
一、Spring Boot 注冊
Spring Boot 提供了?ServletRegistrationBean,?FilterRegistrationBean,?ServletListenerRegistrationBean?三個類分別用來注冊 Servlet, Filter, Listener,下面是 Servlet 的示例代碼。
import?javax.servlet.http.HttpServlet; import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?java.io.IOException;/***?@author?Java技術棧*/ public?class?RegisterServlet?extends?HttpServlet?{@Overrideprotected?void?service(HttpServletRequest?req,?HttpServletResponse?resp)?throws?IOException?{String?name?=?getServletConfig().getInitParameter("name");String?sex?=?getServletConfig().getInitParameter("sex");resp.getOutputStream().println("name?is?"?+?name);resp.getOutputStream().println("sex?is?"?+?sex);}}@Bean public?ServletRegistrationBean?registerServlet()?{ServletRegistrationBean?servletRegistrationBean?=?new?ServletRegistrationBean(new?RegisterServlet(),?"/registerServlet");servletRegistrationBean.addInitParameter("name",?"javastack");servletRegistrationBean.addInitParameter("sex",?"man");return?servletRegistrationBean; }二、組件掃描注冊
Servlet 3.0 之前,Servlet、Filter、Listener 這些組件都需要在?web.xml?中進行配置,3.0 之后開始不再需要?web.xml?這個配置文件了,所有的組件都可以通過代碼配置或者注解來達到目的。
如下圖所示,截圖自 Servlet 3.1。
Servlet 3.0 開始提供了這 3 個注解來代替。
@WebServlet?=> 代替 servlet 配置
@WebFilter?=> 代替 filter 配置
@WebListener?=> 代替 listener 配置
配置 Servlet 示例
import?javax.servlet.annotation.WebInitParam; import?javax.servlet.annotation.WebServlet; import?javax.servlet.http.HttpServlet; import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?java.io.IOException;/***?@author?Java技術棧*/ @WebServlet(name?=?"javaServlet",?urlPatterns?=?"/javastack.cn",?asyncSupported?=?true,initParams?=?{@WebInitParam(name?=?"name",?value?=?"javastack"),@WebInitParam(name?=?"sex",?value?=?"man")?}) public?class?JavaServlet?extends?HttpServlet?{@Overrideprotected?void?service(HttpServletRequest?req,?HttpServletResponse?resp)?throws?IOException?{String?name?=?getServletConfig().getInitParameter("name");String?sex?=?getServletConfig().getInitParameter("sex");resp.getOutputStream().println("name?is?"?+?name);resp.getOutputStream().println("sex?is?"?+?sex);}}配置 Filter 示例
/***?@author?Java技術棧*/ @WebFilter(filterName?=?"javaFilter",?urlPatterns?=?"/*",?initParams?=?{@WebInitParam(name?=?"name",?value?=?"javastack"),@WebInitParam(name?=?"code",?value?=?"123456")?}) public?class?JavaFilter?implements?Filter?{@Overridepublic?void?init(FilterConfig?filterConfig)?throws?ServletException?{System.out.println("java?filter?init.");String?name?=?filterConfig.getInitParameter("name");String?code?=?filterConfig.getInitParameter("code");System.out.println("name?is?"?+?name);System.out.println("code?is?"?+?code);}@Overridepublic?void?doFilter(ServletRequest?request,?ServletResponse?response,?FilterChain?chain)throws?IOException,?ServletException?{System.out.println("java?filter?processing.");chain.doFilter(request,?response);}@Overridepublic?void?destroy()?{System.out.println("java?filter?destroy.");}}Listener 配置方式類似,上面的示例代碼一看就懂,這里不再詳述。
需要注意的是,為了安全考慮,內嵌服務器不會直接執行 Servlet 3.0 里面的?javax.servlet.ServletContainerInitializer?接口,或者 Spring 中的?org.springframework.web.WebApplicationInitializer?接口,否則會導致終止 Spring Boot 應用。
所以,如果使用的是 Spring Boot 內嵌服務器,需要在配置類上面添加額外的?@ServletComponentScan?注解來開啟 Servlet 組件掃描功能,如果使用的是獨立的服務器,則不需要添加,會使用服務器內部的自動發現機制。
三、動態注冊
如果你想在 Spring Boot 中完成 Servlet、Filter、Listener 的初始化操作,你需要在 Spring 中實現下面這個接口,并注冊為一個 bean。
org.springframework.boot.web.servlet.ServletContextInitializer
ServletContext 提供了幾個動態注冊的方法,如下所示。
以下為動態添加 Servlet 示例代碼。
import?javax.servlet.annotation.WebInitParam; import?javax.servlet.annotation.WebServlet; import?javax.servlet.http.HttpServlet; import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?java.io.IOException;/***?@author?Java技術棧*/ @WebServlet(name?=?"javaServlet",?urlPatterns?=?"/javastack.cn",?asyncSupported?=?true,initParams?=?{@WebInitParam(name?=?"name",?value?=?"javastack"),@WebInitParam(name?=?"sex",?value?=?"man")?}) public?class?JavaServlet?extends?HttpServlet?{@Overrideprotected?void?service(HttpServletRequest?req,?HttpServletResponse?resp)?throws?IOException?{String?name?=?getServletConfig().getInitParameter("name");String?sex?=?getServletConfig().getInitParameter("sex");resp.getOutputStream().println("name?is?"?+?name);resp.getOutputStream().println("sex?is?"?+?sex);}}import?cn.javastack.springbootbestpractice.servlet.InitServlet; import?org.springframework.boot.web.servlet.ServletContextInitializer; import?org.springframework.stereotype.Component;import?javax.servlet.ServletContext; import?javax.servlet.ServletRegistration;/***?@author?Java技術棧*/ @Component public?class?ServletConfig?implements?ServletContextInitializer?{@Overridepublic?void?onStartup(ServletContext?servletContext)?{ServletRegistration?initServlet?=?servletContext.addServlet("initServlet",?InitServlet.class);initServlet.addMapping("/initServlet");initServlet.setInitParameter("name",?"javastack");initServlet.setInitParameter("sex",?"man");}}總結
本文介紹了在 Spring Boot 下的 3 種注冊 Servlet、Filter、Listener 的方式,大家靈活運用。
總結
以上是生活随笔為你收集整理的Spring Boot 注册 Servlet 的3种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB自动备份全过程实录
- 下一篇: Spring Boot Dubbo 应用