springboot中添加servlet, filter, listener有2種方式: 代碼注冊servlet 和自動注解注冊(在使用druid監控有使用過)
代碼注冊通過ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 獲得控制。 也可以通過servletContextInitializer接口直接注冊
在 SpringBootApplication 上使用@ServletComponentScan注解后,Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 注解自動注冊,無需其他代碼。
編寫測試類:
Servlet:
1), 使用代碼注冊的方式
package com.iwhere.test.web.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; /** * 通過代碼注冊servlet * 代碼注冊通過ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 獲得控制。 也可以通過實現 ServletContextInitializer 接口直接注冊。 * @author wenbronk * @time 2017年3月17日 下午2:23:21 2017 */ public class MyServlet extends HttpServlet { private static final long serialVersionUID = 6272693061640286219L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doGet(req, resp); System.out.println("method deGet is run"); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doPost(req, resp); System.out.println("method doPost is run"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>這是:MyServlet1</h1>"); out.println("</body>"); out.println("</html>"); } }
然后在 App.java (或者任意一類中, 該類必須@component被spring管理)
/** * 使用代碼注冊Servlet * 此方法不需要加注解 @ServletComponentScan * @return */ @Bean public ServletRegistrationBean myServlet() { return new ServletRegistrationBean(new MyServlet(),"/myServlet/*"); }
2), 使用注解的方式實現:
package com.iwhere.test.web.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; /** * 使用注解的方式注冊servlet * * @author wenbronk * @time 2017年3月17日 下午4:10:33 2017 */ @WebServlet(urlPatterns = "/myServlet2/*", description = "Servlet注解方式") public class AnnotionServlet extends HttpServlet { private static final long serialVersionUID = 1121465382990088487L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doGet(req, resp); System.err.println("do Get"); doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doPost(req, resp); System.err.println("do post"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>這是:myServlet2</h1>"); out.println("</body>"); out.println("</html>"); } }
測試: 可通過http://localhost:8080/springboot-learn/myServlet進行訪問: (有加context配置)

Filter的配置:
此處只講注解方式, 代碼方式和servlet一樣
package com.iwhere.test.web.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; /** * 使用注解的方式創建filter, 實現一個filter接口 * 必須加注解@ServletComponentScan * @author wenbronk * @time 2017年3月17日 下午4:48:19 2017 */ @WebFilter(filterName="myFilter", urlPatterns="/*") public class MyFilter implements Filter { @Override public void destroy() { System.out.println("filter is destroy"); } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { System.out.println("running filter"); arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("filter is init"); } }
之后必須在main類上添加包掃描或者指定類
@SpringBootApplication @EnableScheduling @EnableTransactionManagement(proxyTargetClass = true) @ServletComponentScan(basePackageClasses = {com.binfo.sqgf.config.SqlInjectFilter.class}) public class SqgfApplication {
或者
@SpringBootApplication
@EnableAutoConfiguration
@EnableWebMvc
@ServletComponentScan(basePackages = "com.fanyin.eghm")
public class EghmApplication {
public static void main(String[] args) {
SpringApplication.run(EghmApplication.class, args);
}
}
listener
listener有contextListener, sessionListener,pageListener, beanListener 好多種
servletContextListener;
package com.iwhere.test.web.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; /** * 使用注解的方式實現Contextlistener, 必須實現listener接口 * * @author wenbronk * @time 2017年3月17日 下午4:51:24 2017 */ @WebListener public class MyListener implements ServletContextListener{ @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("servletContext destroyed"); } @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("servletContext init"); } }
sessionListener
package com.iwhere.test.web.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * sessionListener, 監聽session的創建和銷毀 * @author wenbronk * @time 2017年3月17日 下午4:56:22 2017 */ @WebListener public class MySessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent arg0) { System.out.println("HttpSession created"); } @Override public void sessionDestroyed(HttpSessionEvent arg0) { System.out.println("HttpSession destroyed"); } }
補充一點, 在listener中使用 springboot的 工廠
mongoTemplate = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()).getBean(MongoTemplate.class);
