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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。