SpringBoot默认使用Tomcat作为嵌入式的Servlet容器

image-20200325213330585

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

  • 通过SringBoot文件修改和server有关的配置
1
2
3
4
5
6
7
8
9
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替代

SprinBoot-1.0x

EmbeddedServletContainerCustomizer

1
2
3
4
5
6
7
8
9
10
11
@Bean  //一定要将这个定制器加入到容器中
public EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer(){
return new EmbeddedServletContainerCustomizer() {

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

SpringBoot-2.0x

WebServerFactoryCustomize

1
2
3
4
5
6
7
8
9
@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

1
2
3
4
5
6
7
8
@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

1
2
3
4
5
6
7
8
9
10
11
12
@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

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

image-20200326195249084

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

image-20200326195320769

使用其他嵌入式Servlet容器

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

image-20200326200220164

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

image-20200326200343243

1
2
3
4
5
6
7
8
9
10
11
<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>

Jetty容器

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

image-20200326200636375

image-20200326200945570

Undertow容器

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

image-20200326201219407

image-20200326201336698