SpringBoot中注入Servlet&Filter&Listener
1.基本介绍
- 1.官方文档
- 2.Spring-Boot 支持将 Servlet、Filter、Listener 注入Spring 容器, 成为 Spring bean
2.1应用实例–(演示注解方式注入 Servlet、Filter、Listener)
@WebServlet(urlPatterns = {"/servlet01"})
public class Servlet01 extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("hello, servlet");
}
}
- 1.2在主程序配置要扫描包/子包下原生方式注入的servlet
@ServletComponentScan(basePackages = "com.fsh.springboot")
@SpringBootApplication
public class Application
{
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
@Slf4j
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
public class Filter01 implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
log.info("=====Filter01 init()=====");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException
{
log.info("=====Filter01 doFilter()=====");
chain.doFilter(request, response);
}
@Override
public void destroy()
{
log.info("=====Filter01 destroy()=====");
}
}
@Slf4j
@WebListener
public class Listener01 implements ServletContextListener
{
@Override
public void contextInitialized(ServletContextEvent sce)
{
log.info("Listener01 contextInitialized() 项目初始化完成");
}
@Override
public void contextDestroyed(ServletContextEvent sce)
{
log.info("Listener01 contextDestroyed() 项目销毁 ");
}
}
2.2应用实例–(RegistrationBean 注入 Servlet、Filter、Listener)
- 注入Servlet、Filter、Listener
@Configuration(proxyBeanMethods = true)
public class RegisterConfig
{
@Bean
public ServletRegistrationBean servlet_()
{
Servlet01 servlet01 = new Servlet01();
return new ServletRegistrationBean(servlet01, "/servlet01");
}
@Bean
public FilterRegistrationBean filter_()
{
Filter01 filter01 = new Filter01();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter01);
filterRegistrationBean.setUrlPatterns(Arrays.asList("/images/*", "/css/*"));
return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean listener_()
{
Listener01 listener01 = new Listener01();
return new ServletListenerRegistrationBean(listener01);
}
}
3.注意事项
- 请求 Servlet 时,不会到达 DispatherServlet, 因此也不会达到拦截器
- 原因:
- 1.注入的 Servlet 会存在 Spring 容器
- 2.DispatherServlet 也存在 Spring 容器
- 3.Tomcat 在对 Servlet url 匹配的原则, 多个 servlet 都能处理到
同一层路径, 精确优先原则/最长前缀匹配原则.)