翻译的官方文档,个人理解,仅供参考。
SpringBoot包括对内置Tomcat、Jetty和Undertow服务器的支持。大部分开发者只需使用合适的“Starter”来获取完全配置的实例。默认的内置服务器在8080端口监听HTTP请求。
1. Servlets, Filters, and listeners
当使用一个嵌入式Servlet容器时,可以使用Spring Bean或扫描Servlet组件,在符合Servlet规范下注册Servlet、过滤器和所有监听器。
任何Servlet,Filter或Servlet *Listener作为Spring bean的实例都将在嵌入式容器中注册。 如果要在配置期间引用application.properties中的值,这可能特别方便。
默认情况下,假如上下文只包含一个Servlet,它将会被映射到 / 。对于多个Servlet bean,bean名称将用作路径前缀。过滤器将会映射为 /* 。
如果基于约定的映射不够灵活,可以使用ServletRegistrationBean,FilterRegistrationBean和ServletListenerRegistrationBean类进行完全控制。
1.1. Servlet Context初始化
嵌入式servlet容器不会直接执行Servlet 3.0+ javax.servlet.ServletContainerInitializer接口或Spring的org.springframework.web.WebApplicationInitializer接口。 这是一个有意的设计决策,旨在降低设计在war中运行的第三方库将破坏Spring Boot应用程序的风险。
如果需要在Spring Boot应用程序中执行servlet上下文初始化,则应注册实现org.springframework.boot.context.embedded.ServletContextInitializer接口的bean。单个onStartup方法提供对ServletContext的访问,并且可以在必要时轻松地用作现有WebApplicationInitializer的适配器。
1.2. 扫描Servlets, Filters, listeners
当使用一个嵌入式容器时,可以使用@ServletComponentScan注解启用@WebServlet,@WebFilter和@WebListener注释类的自动注册。
提示:@ServletComponentScan在独立容器中不起作用,此时将使用容器的内置发现机制。
2. EmbeddedWebApplicationContext
Spring Boot使用一种新的ApplicationContext类型来支持嵌入式servlet容器。EmbeddedWebApplicationContext是一种特殊类型的WebApplicationContext,它通过搜索单个EmbeddedServletContainerFactory bean来引导自身。 通常会自动配置TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory或UndertowEmbeddedServletContainerFactory。
提示:通常不需要了解这些实现类。 大多数应用程序将自动配置,并创建相应的ApplicationContext和EmbeddedServletContainerFactory。
3. 自定义嵌入式Servlet容器
可以使用Spring Environment属性配置公共servlet容器设置。 通常,我们在application.properties文件中定义属性。
公共服务器配置包括:
- 网络设置:http请求监听端口(server.port),接口地址绑定server.address
- Session设置:session是否持久化(server.session.persistence)、session超时(server.session.timeout)、session数据的位置(server.session.store-dir)、session-cookie配置(server.session.cookie.*)
- 错误管理:错误页面位置(server.error.path)
- SSL:
- Http压缩:
Spring Boot尽可能暴露常见设置,但这并不总是可行。 对于这些情况,专用命名空间提供特定于服务器的自定义(参阅server.tomcat和server.undertow)。 例如,可以使用嵌入式servlet容器的特定功能配置访问日志。
提示:查看ServerProperties.java类
3.1 程序自定义
如果需要以编程方式配置嵌入式servlet容器,可以注册实现EmbeddedServletContainerCustomizer接口的Spring bean。 EmbeddedServletContainerCustomizer提供对ConfigurableEmbeddedServletContainer的访问,其中包括许多自定义setter方法。
import org.springframework.boot.context.embedded.*;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(9000);
}
}
3.2 直接自定义ConfigurableEmbeddedServletContainer
如果上述自定义太有限,可以自己注册TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory或UndertowEmbeddedServletContainerFactory bean。
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
return factory;
}
为许多配置选项提供了Setter。 如果需要做一些更个性化的事情,还会提供几种受保护的方法“钩子”。 有关详细信息,请参阅源代码文档。
4. JSP
运行使用嵌入式servlet容器的Spring Boot应用程序(并打包为可执行存档)时,JSP支持存在一些限制。
- 使用Jetty和Tomcat,如果使用war包装,它应该可以工作。 使用java -jar启动时,可执行的war将起作用,并且还可以部署到任何标准容器。 使用可执行jar时不支持JSP。
- Undertow不支持JSP
- 创建自定义error.jsp页面不会覆盖错误处理的默认视图,而应使用自定义错误页面。