开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
{% note info %} SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 {% endnote %}
定制和修改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);
}
};
}
注册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;
}
创建普通的java类继承HttpServlet
注册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将其转换为集合
创建一个实现了Filter接口的普通java类
注册Listener
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
return registrationBean;
}
创建一个实现了指定监听接口的普通java类
使用其他嵌入式Servlet容器
{% note info %} SpringBoot中pom.xml中引入的web模块,默认使用Tomcat作为嵌入式的Servlet容器 {% endnote %}
引入使用其他的servlet容器,需要在Web模块中先排除默认使用的Tomcat容器
<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>
{% note danger %}
Undertow容器
{% endnote %}
<!--引入其他的Servlet容器-->
<dependency>
<artifactId>spring-boot-starter-undertow</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>