【Spring Boot】配置嵌入式Servlet容器

SpringBoot默認使用Tomcat作爲嵌入式的Servlet容器

在這裏插入圖片描述

定製和修改Servlet容器相關配置

可以通過全局配置文件或者自己編寫WebServerFactoryCustomizer來修改Servlet容器的相關配置

全局配置文件

可以在 全局配置文件application.properties修改和server有關的配置

server.port=8081
server.context‐path=/crud
server.tomcat.uri‐encoding=UTF8
//通用的Servlet容器設置
server.xxx
//Tomcat的設置
server.tomcat.xxx

原理:ServerProperties
在這裏插入圖片描述

編寫WebServerFactoryCustomizer

在MyMvcConfig中編寫WebServerFactoryCustomizer來修改
這是springboot2.x版本的

//使用WebMvcConfigure
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
   
   

    @Bean
    public WebServerFactoryCustomizer webServerFactoryCustomizer(){
   
   

        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
   
   
            @Override
            public void customize(ConfigurableWebServerFactory factory) {
   
   
                factory.setPort(8083);
            }
        };
    }
 }

註冊Servlet三大組件

以前我們可以在web.xml文件中註冊自己的Servlet。
由於SpringBoot默認是以jar包的方式啓動嵌入式的Servlet容器來啓動SpringBoot的web應用,沒有web.xml文件。
下面看一下SpringBoot2.x 如何註冊Servlet 三大組件:

  • ServletRegistrationBean 註冊Servlet
  • FilterRegistrationBean 註冊Filter
  • ServletListenerRegistrationBean 註冊Listener

註冊Servlet

  1. 編寫自己的servlet
    首先我們在 servlet包下寫一個,我們自己的servlet
    public class MyServlet extends HttpServlet {
         
          
        //處理get請求
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         
          
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         
          
            resp.getWriter().write("Hello MyServlet");
        }
    }
    
    

  2. 在配置文件中註冊
    然後在配置文件中使用ServletRegistrationBean 註冊
    @Configuration
    public class MyServerConfig {
         
          
    
    
        //註冊Servlet
        @Bean
        public ServletRegistrationBean myServlet(){
         
          
    
            ServletRegistrationBean<HttpServlet> registrationBean = new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
            return registrationBean;
        }
    

註冊Filter

  1. 編寫自己的Filter
    public class MyFilter implements Filter {
         
         
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
         
         
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
         
         
            System.out.println("Filter 執行了");
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        @Override
        public void destroy() {
         
         
    
        }
    }
    
    
  2. 註冊Filter
        //註冊Filter
        @Bean
        public FilterRegistrationBean myFilter(){
         
         
            FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
            filterFilterRegistrationBean.setFilter(new MyFilter());
            filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet")); //要攔截的請求
            return filterFilterRegistrationBean;
        }
    

註冊Listener

  1. 編寫自己的listener
    public class MyListener implements ServletContextListener {
         
         
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
         
         
            System.out.println("contextInitialized web應用啓動");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
         
         
            System.out.println("contextDestroyed 當前web項目銷燬");
        }
    }
    
    
  2. 註冊listener
    //註冊Listener
    @Bean
    public ServletListenerRegistrationBean myListener(){
   
   
        ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean(new MyListener());
        return servletListenerRegistrationBean;
    }

SpringBoot註冊DispatcherServlet

SpringBoot幫我們自動SpringMVC的時候,自動的註冊SpringMVC的前端控制器;DIspatcherServlet;

在DispatcherServletAutoConfiguration中
在這裏插入圖片描述

這個DispatcherServletRegistrationBean繼承了ServletRegistrationBean
在這裏插入圖片描述
通過這個源碼我們可以知道可以通過server.servletPath來修改SpringMVC前端控制器默認攔截的請求路徑

切換嵌入式Servlet容器

SpringBoot支持以下三種嵌入式Servlet容器:

  • TomCat 默認
  • Jetty
    適合開發長連接(比如Web聊天)
  • Undertow
    優點:高性能 非阻塞的Servlet容器 併發性能好
    缺點:不支持JSP

要切換 嵌入式Servlet容器,就是排除Tomcat依賴,然後導入要切換的容器的依賴即可。
切換成jetty:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>

            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring‐boot‐starter‐tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--引入其他的Servlet容器-->
        <dependency>
            <artifactId>spring-boot-starter-jetty</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>

切換成undertow

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>

            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring‐boot‐starter‐tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--引入其他的Servlet容器-->
        <dependency>
            <artifactId>spring-boot-starter-undertow</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章