SpringBoot(7) - Web(2) - 内置服务器

参考文档:https://docs.spring.io/spring-boot/docs/1.5.17.RELEASE/reference/htmlsingle/#boot-features-embedded-container

翻译的官方文档,个人理解,仅供参考。

 

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页面不会覆盖错误处理的默认视图,而应使用自定义错误页面。

官方示例:https://github.com/spring-projects/spring-boot/tree/v1.5.17.RELEASE/spring-boot-samples/spring-boot-sample-web-jsp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值