spring boot配置Servlet容器


Spring boot 默認使用Tomcat作為嵌入式Servlet容器,只需要引入spring-boot-start-web依賴,默認采用的Tomcat作為容器

01  定制和修改Servlet容器的相關配置(ServerProperties是EmbeddedServletContainerCustomizer的子類)

server.port=8080  
server.context-path=/  
  
# tomcat相關設置  
server.tomcat.uri-encoding=UTF-8  

也可以編寫EmbeddedServletContainerCustomizer(嵌入式的Servlet容器定制器),來修改servlet容器的配置

@Bean  
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){  
    //定制嵌入式的Servlet容器相關的屬性配置  
    return container -> container.setPort(8083);  
} 

2 注冊Servlet容器的三大組件(Servlet  Filter  Listener)

spring boot默認采用是以jar包的形式啟動嵌入式的servlet容器,從而啟動Springboot的web應用,沒有web.xml,當然也可以使用注解的方式(@WebServlet,@WebListener,@WebFilter),現在使用Spring boot作為框架,如果編寫三大組件,則需要使用配置的方式進行注冊

01 ServletRegistrationBean:注冊Servlet

//Servlet定義  
public class MyServlet extends HttpServlet {  
  
    @Override  
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
        System.out.println("這是一個servlet請求...");  
    }  
}  
  
//Servlet注冊  
@Configuration  
public class MyServletConfig {  
  
    //注冊Servlet  
    @Bean  
    public ServletRegistrationBean myServlet(){  
        return new ServletRegistrationBean(new MyServlet(), "/myServlet");  
    }  
} 

 

02 FilterRegistrationBean:注冊Filter

//Filter定義  
public class MyFilter implements Filter {  
    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
  
    }  
  
    @Override  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
        System.out.println("MyFilter process...");  
        //放行  
        chain.doFilter(request, response);  
    }  
  
    @Override  
    public void destroy() {  
  
    }  
}  
  
//Filter注冊  
@Bean  
public FilterRegistrationBean myFilter(){  
    FilterRegistrationBean bean = new FilterRegistrationBean();  
    bean.setFilter(new MyFilter());  
    bean.setUrlPatterns(Arrays.asList("/hello", "/myServlet"));  
    return bean;  
}  

ServletListenerRegistrationBean:注冊Listener

//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銷毀");  
    }  
}  
  
//Listener注冊  
@Bean  
public ServletListenerRegistrationBean myListener(){  
    return new ServletListenerRegistrationBean<>(new MyListener());  
} 

最熟悉的是,spring boot 在自動配置springMVC,會自動注冊SpringMVC前端控制器:DispatcherServlet,該控制器主要在DispatcherServletAutoConfiguration自動配置類中進行注冊

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)  
@Configuration  
@ConditionalOnWebApplication  
@ConditionalOnClass(DispatcherServlet.class)  
@AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class)  
public class DispatcherServletAutoConfiguration {  
      
    //other code...  
      
    public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet";  
      
    private String servletPath = "/";  
      
    @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)  
                @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)  
    public ServletRegistrationBean dispatcherServletRegistration(  
        DispatcherServlet dispatcherServlet) {  
        ServletRegistrationBean registration = new ServletRegistrationBean(  
            dispatcherServlet, this.serverProperties.getServletMapping());  
        //默認攔截 / 所有請求,包括靜態資源,但是不攔截jsp請求;/*會攔截jsp  
        //可以通過修改server.servlet-path來修改默認的攔截請求  
        registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);  
        registration.setLoadOnStartup(  
            this.webMvcProperties.getServlet().getLoadOnStartup());  
        if (this.multipartConfig != null) {  
            registration.setMultipartConfig(this.multipartConfig);  
        }  
        return registration;  
    }  
}  

3 其他Servlet容器

Spring boot默認支持Tomcat,Jetty 和Undertow作為底層容器

而Spring boot默認使用Tomcat,一旦引入spring-boot-starter-web模塊,就默認使用Tomcat

切換其其他Servlet容器

  將tomcat依賴移除同事引入其他Servlet容易

引入jetty

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-web</artifactId>  
    <exclusions>  
        <exclusion>  
            <artifactId>spring-boot-starter-tomcat</artifactId>  
            <groupId>org.springframework.boot</groupId>  
        </exclusion>  
    </exclusions>  
</dependency>  
  
<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-jetty</artifactId>  
</dependency> 

引入undertow

<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-web</artifactId>  
    <exclusions>  
        <exclusion>  
            <artifactId>spring-boot-starter-tomcat</artifactId>  
            <groupId>org.springframework.boot</groupId>  
        </exclusion>  
    </exclusions>  
</dependency>  
  
<dependency>  
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-jetty</artifactId>  
</dependency> 

參考文章   https://blog.csdn.net/caychen/article/details/80344372

這里對於常見的容器jetty和tomcat做一個簡單對比

 jetty  更輕量級,更加靈活,可插拔和可擴展,其架構是基於Handler來實現的,可以同時處理大量長時間連接,默認采用NIO,在處理靜態資源性能較高

Tomcat  默認采用BIO,基於容器設計的,不易擴展,對JavaEE和Servlet的支持更加全面,很多特性直接集成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM