• SpringBoot起飞系列-配置嵌入式Servlet容器(八)


    一、前言

    springboot中默认使用的是tomcat容器,也叫做嵌入式的servlet容器。因为它和我们平常使用的tomcat容器不一样,这个tomcat直接嵌入到的springboot,平常我们使用tomcat容器是一个独立的应用,配置的时候需要在tomcat中的xml中配置,而使用springboot就不一样了,本文我们来学习怎么配置和替换servlet容器、以及注册传统的servlet组件。

    二、自定义Servlet容器的相关配置

    2.1 修改配置文件的值

    我们可以在application.properties中按照传统的配置方式设置,如下:

    server.port=8081
    server.context-path=/crud
    
    server.tomcat.uri-encoding=UTF-8
    
    //通用的Servlet容器设置
    server.xxx
    //Tomcat的设置
    server.tomcat.xxx

    其中server开头的是web容器统一的配置,因为我们以后可以使用其他的web容器,带tomcat的是特定为tomcat容器的配置。

    2.2 编码方式配置

    编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器,来修改Servlet容器的配置。我们可以添加一个MyServerConfig类,用注解的方式来配置我们的Server配置。

     1 package com.example.demo.config;
     2 
     3 import org.springframework.boot.web.server.ConfigurableWebServerFactory;
     4 import org.springframework.boot.web.server.WebServerFactoryCustomizer;
     5 import org.springframework.context.annotation.Bean;
     6 import org.springframework.context.annotation.Configuration;
     7 
     8 
     9 @Configuration
    10 public class MyServerConfig {
    11 
    12     @Bean
    13     public WebServerFactoryCustomizer embeddedServletContainerCustomizer(){
    14         return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
    15             @Override
    16             public void customize(ConfigurableWebServerFactory factory) {
    17                 factory.setPort(8085);
    18             }
    19         };
    20     }
    21 }

    启动之后我们就把端口设置到了8085。

    三、注册Servlet三大组件(Servlet、Filter、Listener)

    由于springboot默认是以jar包的方式启动嵌入式的web服务器来启动springboot应用,没有web.xml文件。传统情况下我们配置三大组件都是在web.xml中添加配置,现在就不能这么做了。

    3.1 注册Servlet

    我们使用ServletRegistrationBean类来往容器中添加Servlet组件,在MyServerConfig中添加一个方法:

    1     @Bean
    2     public ServletRegistrationBean myServlet(){
    3         ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
    4         return registrationBean;
    5     }

    添加一个MyServlet类来处理/myServlet的请求:

    1 public class MyServlet extends HttpServlet {
    2     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    3         response.getWriter().write("hello,my servlet");
    4     }
    5 
    6     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    7         this.doPost(request, response);
    8     }
    9 }

    启动后浏览器访问http://localhost:8085/myServlet,被我们的MyServlet接管处理,因为配置的时候我们要处理的urlPatterns是/myServlet。

    3.2 注册Filter

    一样的原理,我们使用FilterRegistrationBean类来往容器中添加Filter组件:

    1     @Bean
    2     public FilterRegistrationBean myFilter(){
    3         FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    4         registrationBean.setFilter(new MyFilter());
    5         registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
    6         return registrationBean;
    7     }

    添加一个MyFilter的类来处理映射的url:

     1 @WebFilter(filterName = "MyFilter")
     2 public class MyFilter implements Filter {
     3     public void destroy() {
     4     }
     5 
     6     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
     7         resp.getWriter().write("hello,my filter");
     8         chain.doFilter(req, resp);
     9     }
    10 
    11     public void init(FilterConfig config) throws ServletException {
    12 
    13     }
    14 
    15 }

    3.3 注册Listener

    使用ServletListenerRegistrationBean类来往容器中添加Listener组件:

    1     @Bean
    2     public ServletListenerRegistrationBean myListener(){
    3         ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
    4         return registrationBean;
    5     }

    添加一个MyListenner的类来处理逻辑:

     1 public class MyListener implements ServletContextListener {
     2     @Override
     3     public void contextInitialized(ServletContextEvent sce) {
     4         System.out.println("contextInitialized...web应用启动");
     5     }
     6 
     7     @Override
     8     public void contextDestroyed(ServletContextEvent sce) {
     9         System.out.println("contextDestroyed...当前web项目销毁");
    10     }
    11 }

    这就是我们注册传统三大组件的方法。

    有了以上的基础,我们就可以看一下,其实springboot为我们启动springmvc的时候也是通过这种方式注册了DispatcherServlet,这就是我们springmvc中核心的servlet。

     1 @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
     2 @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
     3 public ServletRegistrationBean dispatcherServletRegistration(
     4       DispatcherServlet dispatcherServlet) {
     5    ServletRegistrationBean registration = new ServletRegistrationBean(
     6          dispatcherServlet, this.serverProperties.getServletMapping());
     7     //默认拦截: /  所有请求;包静态资源,但是不拦截jsp请求;   /*会拦截jsp
     8     //可以通过server.servletPath来修改SpringMVC前端控制器默认拦截的请求路径
     9     
    10    registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
    11    registration.setLoadOnStartup(
    12          this.webMvcProperties.getServlet().getLoadOnStartup());
    13    if (this.multipartConfig != null) {
    14       registration.setMultipartConfig(this.multipartConfig);
    15    }
    16    return registration;
    17 }

    四、总结

    这次我们学些了怎样注册传统的三大组件,虽然用到的机会可能不会那么多了,但是springboot的设计理念还是很好的。

  • 相关阅读:
    Windows平台下Android应用抓包挖掘漏洞方法
    长城宽带核心系统存严重漏洞,数十万用户、账单信息存泄露风险
    互联网公司站点通病之弱口令
    【Python】python-一个class继承的小case
    【Python】Python-skier游戏[摘自.与孩子一起学编程]
    【Python】一个python实例:给重要的文件创建备份.摘自crossin-python简明教程
    【JMeter】JMeter完成一个java请求的压测
    【Tcpcopy】离线回放功能
    【JMeter】Jmeter-完成一个http压力测试
    Apache-AB压力测试实例
  • 原文地址:https://www.cnblogs.com/lookings/p/11719568.html
Copyright © 2020-2023  润新知