开发web应用 - Developing web applications
Spring Boot 非常适合开发web应用.你可以非常轻松的使用嵌入式的容器例如:Tomcat,Jetty,Undertow或者Netty来创建HTTP服务器,大多数Web应用程序都可以使用spring-boot-starter-web
来快速启动和运行.你也可以使用spring-boot-starter-webflux
模块来构建响应式Web应用
Spring Web MVC Framework
Spring Web MVC 框架(通常称为Spring MVC) 是一个丰富的"model view conroller"
web框架.
Spring MVC 可以让你创建特殊的@Controller
或RestController
Bean 来处理传入的HTTP请求.
使用@RequestMapping
注解将控制器中的方法映射到HTTp.这是一种个典型的JSON数据的例子
@RestController
@RequestMapping(value="/users")
public class MyRestController {
@RequestMapping(value="/{user}", method=RequestMethod.GET)
public User getUser(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
List<Customer> getUserCustomers(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}", method=RequestMethod.DELETE)
public User deleteUser(@PathVariable Long user) {
// ...
}
}
Spring MVC 是Spring Framework核心的一部分.reference documentation
Spring MVC 自动配置 -Spring MVC auto-configuration
Spring Boot为Spring MVC 提供了自动配置,它们大多数都可以和应用程序完美结合.
自动配置在Spring的默认设置之上添加了以下功能:
-
包含ContentNegotiatingViewResolver和BeanNameViewResolver Bean。
扩 -
支持提供静态资源,包括对WebJars的支持(请参见下文)。
-
自动注册Converter,GenericConverter,Formatter bean。
-
支持HttpMessageConverters(请参见下文)。
-
自动注册MessageCodesResolver(请参见下文)
-
静态index.html支持。
-
自定义Favicon支持(请参阅下文)。
-
自动使用ConfigurableWebBindingInitializer Bean(请参见下文)。
如果你想使用Spring MVC功能,并且只想添加MVC配置,你可以自己添加WebMvcConfiggurer
的@Configuration
类.RequestMappingHandlerMapping
,RequestMappingHandlerAdapter
或ExceptionHandlerExceptionResolver
的自定义实例,则可以声明一个提供此类组件的WebMvcRegistrationsAdapter
实例。
如果要完全控制Spring MVC,则可以添加带有@EnableWebMvc
注释的自己的@Configuration
Http消息转换器 - HttpMessageConverters
Spring MVC 使用HttpMessageConverter
接口转换HTTP请求和响应.其中包含了开箱即用的默认设置.例如:对象可以自动转换为JSON(使用的Jackson
库)或XML(优先使用Jackson
扩展名,其次使用JAXB
)转换为JSON.默认情况下使用UTF-8编码
如果你需要添加或者自定义转换器,你可以使用Spring Boot的HttpMessageConverters
类
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;
@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}
上下文中存在的任何HttpMessageConverter
bean都将添加到转换器列表中。您也可以通过这种方式覆盖默认转换器。
自定义JSOn序列化和反序列化 - Custom JSON Serializers and Deserializers
如果您使用Jackson
来序列化和反序列化JSON数据,则可能需要编写自己的JsonSerializer
和JsonDeserializer
类.自定义序列化程序通常是通过模块向Jackson进行注册的,但是Spring Boot提供了替代的@JsonComponent
批注,这使得直接注册Spring Beans更加容易。
您可以直接在JsonSerializer或JsonDeserializer实现上使用@JsonComponent。您也可以在包含序列化器/反序列化器作为内部类的类上使用它。例如:
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import org.springframework.boot.jackson.*;
@JsonComponent
public class Example {
public static class Serializer extends JsonSerializer<SomeObject> {
// ...
}
public static class Deserializer extends JsonDeserializer<SomeObject> {
// ...
}
}
ApplicationContext
中的所有@JsonComponent
Bean都会自动向Jackson
进行注册,并且由于@JsonComponent
是使用@Component
进行元注释的,因此通常的组件扫描规则适用。
Spring Boot还提供了JsonObjectSerializer
和JsonObjectDeserializer
基类,这些基类在序列化对象时为标准Jackson版本提供了有用的替代方法。有关详细信息,请参见Javadoc。
处理消息码 - MessageCodesResolver
Spring MVC有一种生成错误代码以从绑定错误中呈现错误消息的策略:MessageCodesResolver
。
如果您设置spring.mvc.message-codes-resolver.format
属性PREFIX_ERROR_CODE
或POSTFIX_ERROR_CODE
(请参阅DefaultMessageCodesResolver.Format
中的枚举),Spring Boot将为您创建一个。
静态内容 - Static Content
默认情况下,Spring Boot将从类路径中的/ static
目录(或/ public
或/ resources
或/ META-INF/ resources
)或ServletContext
的根目录中提供静态内容.它使用Spring MVC中的ResourceHttpRequestHandler
,因此您可以通过添加自己的WebMvcConfigurer
并重写addResourceHandlers
方法来修改该行为.
在独立的Web应用程序中,还会启用容器中的默认Servlet,并将其用作后备,如果Spring决定不处理内容,则从ServletContext
的根目录提供内容.大多数情况下,这种情况不会发生(除非您修改默认的MVC配置),因为Spring始终能够通过DispatcherServlet
处理请求。
默认情况下,资源映射在/ **
上,但是您可以通过spring.mvc.static-path-pattern
对其进行调整。例如,将所有资源重定位到/ resources / **
可以实现如下:
spring.mvc.static-path-pattern=/resources/**
您还可以使用spring.resources.static-locations
(用目录位置列表替换默认值)来自定义静态资源位置。如果执行此操作,则默认的欢迎页面检测将切换到您的自定义位置,因此,如果启动时您在任何位置都存在index.html,则它将是应用程序的主页。
除了上面的“标准”静态资源位置外,Webjars content也有特殊情况。如果jar文件以Webjars格式打包,则将使用jar文件来提供/ webjars / **
中具有路径的任何资源。
如果您的应用程序将打包为jar,则不要使用src / main / webapp目录。尽管此目录是一个通用标准,但它仅适用于war打包,如果生成jar,大多数构建工具都将忽略它。
Spring Boot还支持Spring MVC提供的高级资源处理功能,允许使用案例,例如缓存清除静态资源或对Webjars使用版本无关的URL。
要为Webjars使用版本无关的URL,只需添加webjars-locator依赖项。然后以jQuery为例声明您的Webjar,为“ /webjars/jquery/dist/jquery.min.js”
,结果为“ /webjars/jquery/x.y.z/dist/jquery.min.js”
,其中x.y.z
是Webjar版本。
如果您使用的是JBoss,则需要声明webjars-locator-jboss-vfs
依赖关系,而不是webjars-locator
;否则,所有Webjar都解析为404
。
要使用缓存清除,以下配置将为所有静态资源配置缓存清除解决方案,从而有效地在URL中添加内容哈希,例如<link href =“ / css / spring-2a2d595e6ed9a0b24f027f2b63b134d6.css” />
:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
借助ResourceUrlEncodingFilter
,可以在运行时在模板中重写到资源的链接,为Thymeleaf和FreeMarker自动配置。使用JSP时,您应该手动声明此过滤器.目前尚不自动支持其他模板引擎,但可以与自定义模板宏/帮助程序一起使用,也可以与ResourceUrlProvider
一起使用。
例如,使用JavaScript模块加载器动态加载资源时,不能重命名文件.这就是为什么其他策略也受支持并且可以组合的原因。一种“固定”策略将在URL中添加静态版本字符串,而不更改文件名:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/lib/
spring.resources.chain.strategy.fixed.version=v12
通过这种配置,位于“ / js / lib /”
下的JavaScript
模块将使用固定的版本控制策略“ /v12/js/lib/mymodule.js”
,而其他资源仍将使用内容<link href =“ / css / spring-2a2d595e6ed9a0b24f027f2b63b134d6.css“ />
。
有关更多受支持的选项,请参见ResourceUrlProvider
。
该功能已在专门的blog post和Spring Framework的reference documentation文档中进行了详细说明。
自定义图标 - Custom Favicon
Spring Boot在已配置的静态内容位置和类路径的根目录(按此顺序)中查找favicon.ico
。如果存在此类文件,它将自动用作应用程序的收藏夹图标。
ConfigurableWebBindingInitializer
Spring MVC使用WebBindingInitializer
来为特定请求初始化WebDataBinder
。如果您创建自己的ConfigurableWebBindingInitializer
@ Bean
,Spring Boot将自动配置Spring MVC以使用它。
模板引擎 - Template engines
除了REST Web服务,您还可以使用Spring MVC来提供动态HTML内容.Spring MVC支持多种模板技术,包括Thymeleaf,FreeMarker和JSP。许多其他模板引擎还附带了自己的Spring MVC集成。
当您使用默认配置的这些模板引擎之一时,将从src / main / resources / templates中自动提取模板。
错误处理 - Error Handling
Spring Boot默认提供一个/ error映射,以明智的方式处理所有错误,在Servlet
中注册为全局错误页面.对于客户端,它将生成一个JSON响应,其中包含了错误的详细信息,HTTP状态和异常消息.或者在客户端浏览器,有一个’whitelabel’错误视图以HTML格式展示相同的数据(要对其进行自定义,只需要添加一个解析为error
视图).想要完全替换默认的行为,你可以实现ErrorController
并注册,或者简单地添加类型为ErrorAttributes
的bean以使用现有机制,但需要替换其内容.
BasicErrorController
可以用作顶一顶ErrorController
的基类.如果你需要为新的内容类型添加处理程序(默认时专门处理text/html并为其所有内容提供后备功能),则此功能特别有用.要做到这一点,只需要扩展BasicErrorController
并添加一个带有prodeces
属性的@RequestMapping
的公关方法,然后创建一个新的bean.
你还可以定义@ControllerAdvice
,以自定义JSON文档以针对特定的控制或异常类型返回
@ControllerAdvice(basePackageClasses = FooController.class)
public class FooControllerAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}
在上面的示例中,如果YourException由与FooController相同的程序包中定义的控制器引发,则将使用CustomerErrorType POJO的json表示形式而不是ErrorAttributes表示形式。
自定义错误页面
如果您要显示给定状态代码的自定义HTML错误页面,错误页面可以是静态HTML(即添加到任何静态资源文件夹下),也可以使用模板构建。文件名应为确切的状态代码或系列掩码。
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
要使用FreeMarker模板映射所有5xx错误,您将具有以下结构:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- templates/
+- error/
| +- 5xx.ftl
+- <other templates>
对于更复杂的映射,您还可以添加实现ErrorViewResolver接口的bean。
public class MyErrorViewResolver implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request,
HttpStatus status, Map<String, Object> model) {
// Use the request or status to optionally return a ModelAndView
return ...
}
}
您还可以使用常规的Spring MVC功能,例如@ExceptionHandler
methods和@ControllerAdvice
。然后,ErrorController
将拾取所有未处理的异常。
在Spring MVC外部映射错误页面 – Mapping error pages outside of Spring MVC
对于未使用Spring MVC的应用程序,可以使用ErrorPageRegistrar接口直接注册ErrorPages。此抽象直接与基础嵌入式servlet容器一起使用,即使您没有Spring MVC DispatcherServlet,该抽象也可以使用。
@Bean
public ErrorPageRegistrar errorPageRegistrar(){
return new MyErrorPageRegistrar();
}
// ...
private static class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
}
}
如果您在ErrorPage中注册的路径最终将由Filter处理(例如,在某些非Spring Web框架(如Jersey和Wicket)中很常见),则必须将Filter显式注册为ERROR调度程序,例如
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
}
(默认的FilterRegistrationBean不包括ERROR调度程序类型)
WebSphere Application Server上的错误处理 – Error Handling on WebSphere Application Server
当部署到servlet容器时,Spring Boot使用其错误页面过滤器将具有错误状态的请求转发到适当的错误页面.如果尚未提交响应,则只能将请求转发到正确的错误页面。缺省情况下,WebSphere Application Server 8.0及更高版本在成功完成servlet的服务方法后提交响应。您应该通过将com.ibm.ws.webcontainer.invokeFlushAfterService设置为false来禁用此行为。
Spring HATEOAS
如果您正在使用RESTful API开发.Spring Boot为Spring HATEOAS提供了自动配置,可以在大多数应用程序中很好地工作。自动配置取代了使用@EnableHypermediaSupport的需要,并注册了许多bean,以简化基于超媒体的应用程序的构建,包括LinkDiscoverers(用于客户端支持)和ObjectMapper,该对象配置为正确地将响应编组为所需的表示形式。ObjectMapper将基于spring.jackson。*属性或Jackson2ObjectMapperBuilder bean(如果存在)
您可以使用@EnableHypermediaSupport来控制Spring HATEOAS的配置。请注意,这将禁用上述的ObjectMapper定制。
跨域支持 - CORS support
跨域资源共享(CORS)是大多数浏览器实施的W3C规范,使您可以灵活地指定授权哪种跨域请求,而不是使用诸如IFRAME或JSONP之类的不太安全且功能较弱的方法。
从4.2版开始,Spring MVC开箱即用地支持 CORS。在Spring Boot应用程序中使用带有@CrossOrigin
的controller method CORS
configuration不需要任何特定的配置。可以通过使用自定义的addCorsMappings(CorsRegistry)
方法注册WebMvcConfigurer
bean来定义Global CORS configuration:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
Spring WebFlux框架 - The ‘Spring WebFlux framework’
Spring WebFlux 是Spring Framework 5.0 中引入的新的响应式web框架.它不要Servlet API,是完全异步和非阻塞的,并且通过Reactor项目实现的Reactive Streams规范.
Spring WebFlux 有两种形式,基于注解或者类似于Spring MVC的模型
@RestController
@RequestMapping("/users")
public class MyRestController {
@GetMapping("/{user}")
public Mono<User> getUser(@PathVariable Long user) {
// ...
}
@GetMapping("/{user}/customers")
Flux<Customer> getUserCustomers(@PathVariable Long user) {
// ...
}
@DeleteMapping("/{user}")
public Mono<User> deleteUser(@PathVariable Long user) {
// ...
}
}
功能变体“ WebFlux.fn”将路由配置与请求的实际处理分开:
@Configuration
public class RoutingConfiguration {
@Bean
public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) {
return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
.andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
.andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
}
}
@Component
public class UserHandler {
public Mono<ServerResponse> getUser(ServerRequest request) {
// ...
}
public Mono<ServerResponse> getUserCustomers(ServerRequest request) {
// ...
}
public Mono<ServerResponse> deleteUser(ServerRequest request) {
// ...
}
}
WebFlux是Spring框架的一部分,详细信息可在reference documentation中找到。
将spring-boot-starter-webflux
模块添加到您的应用程序。
在您的应用程序中同时添加spring-boot-starter-web
和spring-boot-starter-webflux
模块将导致Spring Boot自动配置Spring MVC.之所以选择这种行为,是因为许多Spring开发人员会将spring-boot-starter-webflux
添加到其Spring MVC应用程序中以使用反应式WebCLient
。您仍然可以通过设置所选的应用程序类型(例如SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE))来强制执行选择。
Spring WebFlux自动配置 - Spring WebFlux auto-configuration
Spring Boot为Spring WebFlux提供了自动配置,可与大多数应用程序完美配合。 自动配置在Spring的默认设置之上添加了以下功能:
- 为HttpMessageReader和HttpMessageWriter实例配置编解码器(请参见下文)。
- 支持提供静态资源,包括对WebJars的支持(请参见下文)。
如果要保留Spring Boot WebFlux功能,而只想添加其他WebFlux configuration,则可以添加自己的类型为WebFluxConfigurer
的@Configuration
类,但不添加@EnableWebFlux
。
如果要完全控制Spring WebFlux,则可以添加带有@EnableWebFlux
注释的自己的@Configuration
带有HttpMessageReaders和HttpMessageWriters的HTTP编解码器 - HTTP codecs with HttpMessageReaders and HttpMessageWriters
Spring WebFlux使用HttpMessageReader
和HttpMessageWriter
接口转换HTTP请求和响应。通过查看类路径中可用的库,将它们配置为具有合理默认值的CodecConfigurer
。
Spring Boot将使用CodecCustomizer
实例应用进一步的自定义。例如,spring.jackson.*
配置键将应用于Jackson编解码器。
如果需要添加或自定义编解码器,则可以创建自定义CodecCustomizer
组件:
import org.springframework.boot.web.codec.CodecCustomizer;
@Configuration
public class MyConfiguration {
@Bean
public CodecCustomizer myCodecCustomizer() {
return codecConfigurer -> {
// ...
}
}
}
静态内容 - Static Content
默认情况下,Spring Boot将从类路径中名为/ static
(或/ public
或/ resources
或/ META-INF / resources
)的目录中提供静态内容。它使用Spring WebFlux中的ResourceWebHandler
,因此您可以通过添加自己的WebFluxConfigurer
并覆盖addResourceHandlers
方法来修改该行为。
默认情况下,资源映射在/ **
上,但是您可以通过spring.mvc.static-path-pattern
对其进行调整。例如,将所有资源重定位到/ resources / **
可以实现如下:
spring.mvc.static-path-pattern=/resources/**
您还可以使用spring.resources.static-locations
(用目录位置列表替换默认值)来自定义静态资源位置。如果执行此操作,默认的欢迎页面检测将切换到您的自定义位置,因此,如果启动时您在任何位置都存在index.html,则它将是应用程序的主页。
除了上面的“标准”静态资源位置外,Webjars content也有特殊情况。如果jar文件以Webjars格式打包,则将使用jar文件来提供/ webjars / **`中具有路径的任何资源。
Spring WebFlux应用程序并不严格依赖Servlet API,因此它们不能像war一样部署,也不能使用src / main / webapp目录。
模板引擎 - Template engines
除了REST Web服务之外,您还可以使用Spring WebFlux来提供动态HTML内容。 Spring WebFlux支持各种模板技术,包括Thymeleaf,FreeMarker和Mustache。
Spring Boot包含对以下模板引擎的自动配置支持:
当您使用默认配置的这些模板引擎之一时,将从src / main / resources / templates
中自动提取模板。
JAX-RS and Jersey
如果您更喜欢REST端点的JAX-RS编程模型,则可以使用可用的实现之一来代替Spring MVC。如果只在应用程序上下文中将它们的Servlet或Filter注册为@ Bean,Jersey 1.x和Apache CXF即开即用。 Jersey 2.x具有对Spring的本机支持,因此我们在Spring Boot中还与启动程序一起为其提供了自动配置支持。
要开始使用Jersey 2.x,只需将spring-boot-starter-jersey
作为依赖项包括在内,然后您需要一个ResourceConfig类型的@Bean,在其中注册所有端点:
@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(Endpoint.class);
}
}
Jersey
对扫描可执行档案的支持非常有限。 例如,在运行可执行的war文件时,它无法扫描WEB-INF / classs中找到的程序包中的端点。 为了避免这种限制,不应使用packages方法,并且应使用如上所述的register方法分别注册端点。
您还可以注册任意数量的bean,以实现ResourceConfigCustomizer
来进行更高级的自定义。 所有已注册的端点应为具有HTTP资源注释的@Components
(@GET等),例如
@Component
@Path("/hello")
public class Endpoint {
@GET
public String message() {
return "Hello";
}
}
由于端点是Spring @Component
,因此其生命周期由Spring管理,您可以@Autowired
依赖项并使用@Value注入外部配置。默认情况下,Jersey servlet将被注册并映射到/ *
。您可以通过将@ApplicationPath
添加到ResourceConfig
来更改映射。默认情况下,Jersey将在名为ServletServletRegistration
的ServletRegistrationBean
类型的@Bean
中设置为Servlet
。默认情况下,该servlet
会被延迟初始化,但是您可以使用spring.jersey.servlet.load-on-startup
对其进行自定义。您可以通过创建自己的同名bean来禁用或覆盖该bean。您还可以通过设置spring.jersey.type = filter
(在这种情况下要替换或覆盖的@Bean是jerseyFilterRegistration)来使用Filter而不是Servlet。 Servlet具有@Order
,您可以使用spring.jersey.filter.order
进行设置。可以使用spring.jersey.init.*
为Servlet和Filter注册都赋予init参数,以指定属性映射。有一个Jersey示例,因此您可以了解如何进行设置。还有一个Jersey 1.x示例。请注意,在Jersey 1.x示例中,已经配置了spring-boot maven插件来解压缩某些Jersey jar,以便可以由JAX-RS实现对其进行扫描(因为该示例要求在其Filter注册中对其进行扫描) 。如果将任何JAX-RS资源打包为嵌套jar,则可能需要执行相同的操作。
嵌入式Servlet容器支持 - Embedded servlet container support
Spring Boot包括对嵌入式Tomcat,Jetty和Undertow服务器的支持。 大多数开发人员只会使用适当的“入门程序”来获取完整配置的实例。 默认情况下,嵌入式服务器将在端口8080上侦听HTTP请求。
如果您选择在CentOS上使用Tomcat,请注意,默认情况下,将使用一个临时目录来存储编译的JSP,文件上传等。当应用程序运行时,此目录可能被tmpwatch删除,从而导致失败。 为避免这种情况,您可能需要自定义tmpwatch配置,以使tomcat。*目录不会被删除,或者配置server.tomcat.basedir,以便嵌入式Tomcat使用其他位置。
Servlet,过滤器和侦听器 - Servlets, Filters, and listeners
使用嵌入式Servlet容器时,您可以使用Spring bean或扫描Servlet组件来注册Servlet规范中的Servlet,过滤器和所有侦听器(例如HttpSessionListener
)。
将Servlet,过滤器和侦听器注册为Spring Bean
任何作为Spring bean的Servlet
,Filter
或Servlet * Listener
实例都将在嵌入式容器中注册。如果要在配置过程中引用application.properties
中的值,这可能特别方便。
默认情况下,如果上下文仅包含单个Servlet,它将被映射到 /
。对于多个Servlet Bean,该Bean名称将用作路径前缀。过滤器将映射到 / *
如果基于约定的映射不够灵活,则可以使用ServletRegistrationBean
,FilterRegistrationBean
和ServletListenerRegistrationBean
类进行控制。
Servlet上下文初始化 - Servlet Context Initialization
入式Servlet容器将不会直接执行Servlet 3.0+ javax.servlet.ServletContainerInitializer
接口或Spring的org.springframework.web.WebApplicationInitializer
接口。这是一个有意设计的决定,旨在降低旨在在战争中运行的第三方库破坏Spring Boot应用程序的风险。
如果您需要在Spring Boot应用程序中执行servlet上下文初始化,您应该注册一个实现org.springframework.boot.web.servlet.ServletContextInitializer
接口的bean。单个onStartup
方法提供对ServletContext
的访问,并且可以根据需要轻松地用作现有WebApplicationInitializer
的适配器
扫描Servlet,过滤器和侦听器
使用嵌入式容器时,可以使用@ServletComponentScan
启用@ WebServlet
,@ WebFilter
和@WebListener
注释类的自动注册。
@ServletComponentScan在独立容器中无效,在该容器中将使用容器的内置发现机制。
The ServletWebServerApplicationContext
在后台,Spring Boot使用一种新型的ApplicationContext
来支持嵌入式servlet容器。ServletWebServerApplicationContext
是WebApplicationContext
的一种特殊类型,它通过搜索单个ServletWebServerFactory
bean来自我引导。通常,将自动配置TomcatServletWebServerFactory
,JettyServletWebServerFactory
或UndertowServletWebServerFactory
。
通常,您不需要了解这些实现类。大多数应用程序将被自动配置,并且将代表您创建适当的ApplicationContext和ServletWebServerFactory
自定义嵌入式Servlet容器 - Customizing embedded servlet containers
可以使用Spring Environment
属性配置常用的servlet容器设置。通常,您将在application.properties
文件中定义属性。
常用服务器设置包括:
- Network settings: listen port for incoming HTTP requests (
server.port
), interface address to bind toserver.address
, etc. - Session settings: whether the session is persistent (
server.session.persistence
), session timeout (server.session.timeout
), location of session data (server.session.store-dir
) and session-cookie configuration (server.session.cookie.*
). - Error management: location of the error page (
server.error.path
), etc. - SSL
- HTTP compression
有关完整列表,请参见ServerProperties
类。
定制程序
如果您需要以编程方式配置嵌入式servlet容器,则可以注册一个实现WebServerFactoryCustomizer
接口的Spring Bean。WebServerFactoryCustomizer
提供对ConfigurableServletWebServerFactory
的访问,其中包括许多自定义设置方法。存在针对Tomcat,Jetty和Undertow的专用变体
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
直接自定义ConfigurableServletWebServerFactory
如果上述定制技术太有限,则可以自己注册TomcatServletWebServerFactory
,JettyServletWebServerFactory
或UndertowServletWebServerFactory
bean。
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
return factory;
}
提供了许多配置选项的设置器。如果您需要做一些更奇特的操作,还提供了几种受保护的方法“钩子”。有关详细信息,请参见源代码文档。
JSP 限制 - JSP limitations
运行使用嵌入式servlet容器(并打包为可执行档案)的Spring Boot应用程序时,JSP支持存在一些限制。
- With Tomcat it should work if you use war packaging, i.e. an executable war will work, and will also be deployable to a standard container (not limited to, but including Tomcat). An executable jar will not work because of a hard coded file pattern in Tomcat.
- With Jetty it should work if you use war packaging, i.e. an executable war will work, and will also be deployable to any standard container.
- Undertow does not support JSPs.
- Creating a custom
error.jsp
page won’t override the default view for error handling, custom error pages should be used instead.
有一个JSPJSP sample,因此您可以了解如何进行设置。
更多精彩内容 ~~~~ 关注一波公众号