SpringBoot通过代码注册Servlet、Fillter、Listener

Spring Boot提供了 ServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBean这3个东西来进行配置Servlet、Filter、Listener。


通过自定义配置文件WebConfig.java注册Servlet、Filter、Listener。

[java]  view plain  copy
  1. import java.util.ArrayList;  
  2. import java.util.EventListener;  
  3. import java.util.List;  
  4.    
  5. import org.springframework.boot.context.embedded.FilterRegistrationBean;  
  6. import org.springframework.boot.context.embedded.ServletListenerRegistrationBean;  
  7. import org.springframework.boot.context.embedded.ServletRegistrationBean;  
  8. import org.springframework.context.annotation.Bean;  
  9. import org.springframework.context.annotation.Configuration;  
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  
  11.    
  12. import com.tianshouzhi.springbootstudy.web.filter.DemoFilter;  
  13. import com.tianshouzhi.springbootstudy.web.listener.DemoListener;  
  14. import com.tianshouzhi.springbootstudy.web.servlet.DemoServlet;  
  15.    
  16. @Configuration  
  17. public class WebConfig extends WebMvcConfigurerAdapter{  
  18.     @Bean  
  19.     public FilterRegistrationBean getDemoFilter(){  
  20.         DemoFilter demoFilter = new DemoFilter();  
  21.         FilterRegistrationBean registrationBean = new FilterRegistrationBean();  
  22.         registrationBean.setFilter(demoFilter);  
  23.         List urlPatterns = new ArrayList();  
  24.         urlPatterns.add("/*");//拦截路径,可以添加多个  
  25.         registrationBean.setUrlPatterns(urlPatterns);  
  26.         registrationBean.setOrder(1);  
  27.         return registrationBean;  
  28.     }  
  29.     @Bean  
  30.     public ServletRegistrationBean getDemoServlet(){  
  31.         DemoServlet demoServlet = new DemoServlet();  
  32.         ServletRegistrationBean registrationBean = new ServletRegistrationBean();  
  33.         registrationBean.setServlet(demoServlet);  
  34.         List urlMappings=new ArrayList();  
  35.         urlMappings.add("/demoservlet");////访问,可以添加多个  
  36.         registrationBean.setUrlMappings(urlMappings);  
  37.         registrationBean.setLoadOnStartup(1);  
  38.         return registrationBean;  
  39.     }  
  40.     @Bean  
  41.     public ServletListenerRegistrationBean getDemoListener(){  
  42.         ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean<>();  
  43.         registrationBean.setListener(new DemoListener());  
  44.         //registrationBean.setOrder(1);  
  45.         return registrationBean;  
  46.     } 

spring boot中注册Servlet的两种方式

但spring boot把tomcat都给隐藏了,更别说web.xml了。好在提供了另外的方式配置servlet。
1.@WebServlet注解:
这个是javaee的注解,是servlet3.0以后提供的。spring boot会扫描这个注解,并将这个注解注解的类注册到web容器中作为一个servlet。
但是DispatcherServlet并不是自定义的servlet,而是框架提供的servlet,所以此方法不行。
2.ServletRegistrationBean:
这个bean是由spring boot提供专门来注册servlet的,可以象注册bean一样去配置servlet。

    @Bean
    public ServletRegistrationBean restServlet(){
        //注解扫描上下文
        AnnotationConfigWebApplicationContext applicationContext
                = new AnnotationConfigWebApplicationContext();
        //base package
        applicationContext.scan("com.jerryl.rest");
        //通过构造函数指定dispatcherServlet的上下文
        DispatcherServlet rest_dispatcherServlet
                = new DispatcherServlet(applicationContext);

        //用ServletRegistrationBean包装servlet
        ServletRegistrationBean registrationBean
                = new ServletRegistrationBean(rest_dispatcherServlet);
        registrationBean.setLoadOnStartup(1);
        //指定urlmapping
        registrationBean.addUrlMappings("/rest/*");
        //指定name,如果不指定默认为dispatcherServlet
        registrationBean.setName("rest");
        return registrationBean;
    }

其中需要注意的是registration.setName("rest"),这个语句很重要,因为name相同的ServletRegistrationBean只有一个会生效,也就是说,后注册的会覆盖掉name相同的ServletRegistrationBean。

你可能感兴趣的:(SpringBoot通过代码注册Servlet、Fillter、Listener)