Spring Boot - Servlet、Filter、Listener
在Spring Boot中有三种实现方式
方法一:通过注册ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean
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 CustomServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.print("doGet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.print("doPost"); doGet(req, resp); } }
import javax.servlet.*; import java.io.IOException; public class CustomFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("filter init"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("filter doFilter"); } @Override public void destroy() { System.out.println("filter destroy"); } }
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class CustomListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("listener contextInitialized"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("listener contextDestroyed"); } }
在启动类中注册bean:
import com.ken.util.filter.CustomFilter; import com.ken.util.listener.CustomListener; import com.ken.util.servlet.CustomServlet; 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; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @SpringBootApplication public class KenApplication { public static void main(String[] args) { SpringApplication.run(KenApplication.class, args); } @RequestMapping("/") public String home() { return "Spring Boot"; } @Bean public ServletRegistrationBean servletRegistrationBean() { return new ServletRegistrationBean(new CustomServlet(), "/customServlet"); } @Bean public FilterRegistrationBean filterRegistrationBean() { //return new FilterRegistrationBean(new CustomFilter(), servletRegistrationBean());只对/customServlet生效 return new FilterRegistrationBean(new CustomFilter());//对所有请求生效 } @Bean public ServletListenerRegistrationBean<CustomListener> servletListenerRegistrationBean() { return new ServletListenerRegistrationBean<>(new CustomListener()); } }
方法二:通过实现 ServletContextInitializer 接口直接注册
import com.ken.util.filter.CustomFilter; import com.ken.util.listener.CustomListener; import com.ken.util.servlet.CustomServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.DispatcherType; import javax.servlet.ServletContext; import javax.servlet.ServletException; import java.util.EnumSet; @RestController @SpringBootApplication public class KenApplication implements ServletContextInitializer { public static void main(String[] args) { SpringApplication.run(KenApplication.class, args); } @RequestMapping("/") public String home() { return "Spring Boot"; } @Override public void onStartup(ServletContext servletContext) throws ServletException { servletContext.addServlet("customServlet", new CustomServlet()).addMapping("/customServlet"); servletContext.addFilter("customFilter", new CustomFilter()).addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "customServlet"); servletContext.addListener(new CustomListener()); } }
方法三:在 SpringBootApplication 上使用 @ServletComponentScan 注解后,直接通过@WebServlet、@WebFilter、@WebListener 注解自动注册。