SpringBoot初始教程之Servlet、Filter、Listener配置详解
1.介绍
通过之前的文章来看,SpringBoot涵盖了很多配置,但是往往一些配置是采用原生的Servlet进行的,但是在SpringBoot中不需要配置web.xml的
因为有可能打包之后是一个jar包的形式,这种情况下如何解决?SpringBoot提供了两种方案进行解决
2.快速开始
2.1方案一
方案一采用原生Servlet3.0的注解进行配置、@WebServlet、@WebListener、@WebFilter是Servlet3.0api中提供的注解
通过注解可以完全代替web.xml中的配置,下面是一个简单的配置
IndexServlet
@WebServlet(name="IndexServlet",urlPatterns="/hello")
publicclassIndexServletextendsHttpServlet{
@Override
publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
resp.getWriter().print("helloword");
resp.getWriter().flush();
resp.getWriter().close();
}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
this.doGet(req,resp);
}
}
IndexListener
@WebListener
publicclassIndexListenerimplementsServletContextListener{
privateLoglog=LogFactory.getLog(IndexListener.class);
@Override
publicvoidcontextInitialized(ServletContextEventservletContextEvent){
log.info("IndexListenercontextInitialized");
}
@Override
publicvoidcontextDestroyed(ServletContextEventservletContextEvent){
}
}
IndexFilter
@WebFilter(urlPatterns="/*",filterName="indexFilter")
publicclassIndexFilterimplementsFilter{
Loglog=LogFactory.getLog(IndexFilter.class);
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
log.info("initIndexFilter");
}
@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
log.info("doFilterIndexFilter");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
publicvoiddestroy(){
}
}
上面配置完了,需要配置一个核心的注解@ServletComponentScan,具体配置项如下,可以配置扫描的路径
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ServletComponentScanRegistrar.class)
public@interfaceServletComponentScan{
@AliasFor("basePackages")
String[]value()default{};
@AliasFor("value")
String[]basePackages()default{};
Class>[]basePackageClasses()default{};
}
把注解加到入口处启动即可
@SpringBootApplication
@ServletComponentScan
publicclassAppApplication{
publicstaticvoidmain(String[]args)throwsException{
SpringApplication.run(AppApplication.class,args);
}
}
2.2方案二
方案二是采用自己SpringBoot配置bean的方式进行配置的,SpringBoot提供了三种BeanFilterRegistrationBean、ServletRegistrationBean、ServletListenerRegistrationBean分别对应配置原生的Filter、Servlet、Listener,下面提供的三个配置和方案一采用的方式能够达到统一的效果
@Bean
publicServletRegistrationBeanindexServletRegistration(){
ServletRegistrationBeanregistration=newServletRegistrationBean(newIndexServlet());
registration.addUrlMappings("/hello");
returnregistration;
}
@Bean
publicFilterRegistrationBeanindexFilterRegistration(){
FilterRegistrationBeanregistration=newFilterRegistrationBean(newIndexFilter());
registration.addUrlPatterns("/");
returnregistration;
}
@Bean
publicServletListenerRegistrationBeanservletListenerRegistrationBean(){
ServletListenerRegistrationBeanservletListenerRegistrationBean=newServletListenerRegistrationBean();
servletListenerRegistrationBean.setListener(newIndexListener());
returnservletListenerRegistrationBean;
}
3.总结
两种方案在使用上有差别,但是在内部SpringBoot的实现上是无差别的,即使使用的是Servlet3.0注解,也是通过扫描注解
转换成这三种bean的FilterRegistrationBean、ServletRegistrationBean、ServletListenerRegistrationBean
4.扩展
大家在使用的时候有没有发觉,其实SpringBoot在使用SpringMvc的时候不需要配置DispatcherServlet的,因为已经自动配置了,但是如果想要加一些初始配置参数如何解决,方案如下:
@Bean
publicServletRegistrationBeandispatcherRegistration(DispatcherServletdispatcherServlet){
ServletRegistrationBeanregistration=newServletRegistrationBean(dispatcherServlet);
registration.addUrlMappings("*.do");
registration.addUrlMappings("*.json");
returnregistration;
}
可以通过注入DispatcherServlet然后用ServletRegistrationBean包裹一层动态的加上一些初始参数
本文代码:springboot-Servlet-Filter-Listener_jb51.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。