一、如何定制和修改 Servlet 容器的相关配置
1、通过修改 application.properties 配置文件,例如
//通用的Servlet容器设置
server.xxx
// 端口设置
server.port=8081
// 上下文根设置
server.context-path=/xiaomaomao
// tomcat 的设置
server.tomcat.xxx
// jetty 的设置
server.jetty.xxx
所有 Servlet 容器相关的配置都与 ServerProperties 进行了相关的绑定
假设我们这里嵌入式的 Servlet 容器是 tomcat,我们需要修改 tomcat 相关配置,只需要在 application.properties 中进行配置就可以了,具体可以配置的选项如下
2、通过往容器中注入 bean 的方式, Springboot 1.x 版本 和 Springboot 2.x 版本注入的 bean 不同
Springboot 1.x 版本:编写一个嵌入式 Servlet 容器定制器 EmbeddedServletContainerCustomizer , 通过调用其中的 Custome
@Configuration
public class MyEmbeddedContainerConfig {
@Bean
public EmbeddedServletContainerCustomizer myCustomizer(){
EmbeddedServletContainerCustomizer servletContainerCustomizer = new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setContextPath("/xiaomaomao");
container.setPort(8084);
}
};
return servletContainerCustomizer;
}
}
Springboot 2.x 版本:编写一个 WebServerFactoryCustomizer ,并将其加入容器中
@Configuration
public class MyEmbeddedContainerConfig {
@Bean
public WebServerFactoryCustomizer myCustomizer(){
return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.setPort(8084);
factory.setContextPath("/xiaomaomao");
}
};
}
}
二、注册 Servlet 三大组件 (Servlet、Filter、Listener)
1、注册 Servlet
@Bean
public ServletRegistrationBean servletBean(){
// 自定义 MyEmbeddedServlet 实现 HttpServlet
ServletRegistrationBean<MyEmbeddedServlet> myEmbedServlet = new
ServletRegistrationBean<>(new MyEmbeddedServlet(), "/myEmbedServlet");
return myEmbedServlet;
}
2、注册 Filter
@Bean
public FilterRegistrationBean filterBean(){
FilterRegistrationBean<MyEmbeddedFilter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new MyEmbeddedFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/xiaomaomao","/myEmbedServlet"));
return filterRegistrationBean;
}
3、注册 Listener
@Bean
public ServletListenerRegistrationBean servletListenerRegistrationBean(){
ServletListenerRegistrationBean listenerRegistrationBean =
new ServletListenerRegistrationBean(new MyEmbeddedListener());
return listenerRegistrationBean;
}
Springboot 默认的嵌入式 Servlet 容器是 tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
// 引入 web 模块默认就是使用嵌入式的 Tomcat 作为 Servlet 容器
</dependency>
三、那么我们想切换其它的 Servlet 容器 (jetty、undertow),应该执行的步骤如下
1、排除 Springboot 默认的嵌入式 Servlet 容器 tomcat 的依赖
2、引入 jetty 或 undertow 的相关依赖即可