服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - SpringBoot初始教程之Servlet、Filter、Listener配置详解

SpringBoot初始教程之Servlet、Filter、Listener配置详解

2020-12-28 09:24尊少 Java教程

本篇文章主要介绍了SpringBoot初始教程之Servlet、Filter、Listener配置详解,具有一定的参考价值,有兴趣的可以了解一下

1.介绍

通过之前的文章来看,SpringBoot涵盖了很多配置,但是往往一些配置是采用原生的Servlet进行的,但是在SpringBoot中不需要配置web.xml的

因为有可能打包之后是一个jar包的形式,这种情况下如何解决?SpringBoot 提供了两种方案进行解决

2.快速开始

2.1 方案一

方案一采用原生Servlet3.0的注解进行配置、@WebServlet 、@WebListener、@WebFilter是Servlet3.0 api中提供的注解
通过注解可以完全代替web.xml中的配置,下面是一个简单的配置

IndexServlet

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@WebServlet(name = "IndexServlet",urlPatterns = "/hello")
  public class IndexServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      resp.getWriter().print("hello word");
      resp.getWriter().flush();
      resp.getWriter().close();
    }
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      this.doGet(req, resp);
    }
  }

IndexListener

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@WebListener
 public class IndexListener implements ServletContextListener {
   private Log log = LogFactory.getLog(IndexListener.class);
 
   @Override
   public void contextInitialized(ServletContextEvent servletContextEvent) {
     log.info("IndexListener contextInitialized");
   }
 
   @Override
   public void contextDestroyed(ServletContextEvent servletContextEvent) {
 
   }
 }

IndexFilter

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@WebFilter(urlPatterns = "/*", filterName = "indexFilter")
  public class IndexFilter implements Filter {
    Log log = LogFactory.getLog(IndexFilter.class);
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
      log.info("init IndexFilter");
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      log.info("doFilter IndexFilter");
      filterChain.doFilter(servletRequest,servletResponse);
 
    }
 
    @Override
    public void destroy() {
 
    }
  }

上面配置完了,需要配置一个核心的注解@ServletComponentScan,具体配置项如下,可以配置扫描的路径

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Target(ElementType.TYPE)
  @Retention(RetentionPolicy.RUNTIME)
  @Documented
  @Import(ServletComponentScanRegistrar.class)
  public @interface ServletComponentScan {
 
 
    @AliasFor("basePackages")
    String[] value() default {};
 
 
    @AliasFor("value")
    String[] basePackages() default {};
 
 
    Class<?>[] basePackageClasses() default {};
 
  }

把注解加到入口处启动即可

?
1
2
3
4
5
6
7
8
9
@SpringBootApplication
@ServletComponentScan
public class AppApplication {
 
  public static void main(String[] args) throws Exception {
    SpringApplication.run(AppApplication.class, args);
  }
 
}

2.2 方案二

方案二是采用自己SpringBoot 配置bean的方式进行配置的,SpringBoot提供了三种BeanFilterRegistrationBean、ServletRegistrationBean、ServletListenerRegistrationBean 分别对应配置原生的Filter、Servlet、Listener,下面提供的三个配置和方案一采用的方式能够达到统一的效果

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Bean
public ServletRegistrationBean indexServletRegistration() {
  ServletRegistrationBean registration = new ServletRegistrationBean(new IndexServlet());
  registration.addUrlMappings("/hello");
  return registration;
}
 
@Bean
public FilterRegistrationBean indexFilterRegistration() {
  FilterRegistrationBean registration = new FilterRegistrationBean(new IndexFilter());
  registration.addUrlPatterns("/");
  return registration;
}
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
  ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
  servletListenerRegistrationBean.setListener(new IndexListener());
  return servletListenerRegistrationBean;
}

3.总结

两种方案在使用上有差别,但是在内部SpringBoot的实现上是无差别的,即使使用的是Servlet3.0注解,也是通过扫描注解
转换成这三种bean的FilterRegistrationBean、ServletRegistrationBean、ServletListenerRegistrationBean

4.扩展

大家在使用的时候有没有发觉,其实SpringBoot在使用SpringMvc的时候不需要配置DispatcherServlet的,因为已经自动配置了, 但是如果想要加一些初始配置参数如何解决,方案如下:

?
1
2
3
4
5
6
7
@Bean
  public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
    ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
    registration.addUrlMappings("*.do");
    registration.addUrlMappings("*.json");
    return registration;
  }

可以通过注入DispatcherServlet 然后用ServletRegistrationBean包裹一层 动态的加上一些初始参数

本文代码:springboot-Servlet-Filter-Listener.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/king_is_everyone/article/details/53116744

延伸 · 阅读

精彩推荐