SpringBoot配置嵌入式Servelt容器

283 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

{% note info %} SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 {% endnote %}

image-20200325213330585

定制和修改Servlet容器的相关配置

  • 通过SringBoot文件修改和server有关的配置
server.port=8081
server.context-path=/crud

server.tomcat.uri-encoding=UTF-8

//通用的Servlet容器设置
server.xxx
//Tomcat的设置
server.tomcat.xxx
  • 编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器,来修改Servlet容器的配置。Spring Boot2.0以上版本EmbeddedServletContainerCustomizer被WebServerFactoryCustomizer替代

{% note danger %} SprinBoot-1.0x

EmbeddedServletContainerCustomizer

{% endnote %}

@Bean  //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
    return new EmbeddedServletContainerCustomizer() {

        //定制嵌入式的Servlet容器相关的规则
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.setPort(8083);
        }
    };
}

{% note success %} SpringBoot-2.0x

WebServerFactoryCustomize

{% endnote %}

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

image-20200325214902184

注册Servlet三大组件

由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。

注册三大组件用以下方式

  • ServletRegistrationBean
  • FilterRegistrationBean
  • ServletListenerRegistrationBean

注册Servlet

 @Bean
    public ServletRegistrationBean myServlet(){
        ServletRegistrationBean registrationBean = new 
        //没传入urlMapping,会默认以servelt的类名首字母小写为urlMapping值:myServlet
        ServletRegistrationBean(new MyServlet(),"/myServlet");
        registrationBean.setLoadOnStartup(1);
        return registrationBean;
    }

image-20200326194033792

创建普通的java类继承HttpServlet

image-20200326194327951

image-20200326194459018

注册Filter

 @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());


        //registrationBean.addUrlPatterns("/hello","/myServlet");

        //setUrlPatterns()这是一次性的设置一个集合。
        registrationBean.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
        return registrationBean;
    }

addUrlPatterns方法是添加一个拦截的URL,多个用逗号隔开

setUrlPatterns方法这是一次性的设置一个集合,想要配置拦截的URL。首先要使用Arrays.asList将其转换为集合

image-20200326194701417

创建一个实现了Filter接口的普通java类

image-20200326194742567

注册Listener

  @Bean
    public ServletListenerRegistrationBean myListener(){
        ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
        return registrationBean;
    }

image-20200326195249084

创建一个实现了指定监听接口的普通java类

image-20200326195320769

使用其他嵌入式Servlet容器

{% note info %} SpringBoot中pom.xml中引入的web模块,默认使用Tomcat作为嵌入式的Servlet容器 {% endnote %}

image-20200326200220164

引入使用其他的servlet容器,需要在Web模块中先排除默认使用的Tomcat容器

image-20200326200343243

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--在Web模块中排除默认的Tomcat-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
 </dependency>

{% note success %}

Jetty容器

{% endnote %}

 <!--引入其他的servlet容器,需要在Web模块中先排除默认的Tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>

image-20200326200636375

image-20200326200945570

{% note danger %}

Undertow容器

{% endnote %}

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

image-20200326201219407

image-20200326201336698