一、web应用开发
Spring Boot非常适合Web应用程序开发。 您可以使用嵌入式Tomcat,Jetty,Undertow或Netty创建独立的HTTP服务器。 大多数Web应用程序都使用spring-boot-starter-web
模块来快速启动和运行。 您还可以选择使用spring-boot-starter-webflux
模块构建反应式Web应用程序。
1、Spring Web MVC框架
Spring Web MVC框架(通常简称为“ Spring MVC”)是一个丰富的“模型-视图-控制器” Web框架。 Spring MVC使您可以创建特殊的@Controller
或@RestController
Bean来处理传入的HTTP请求。 使用@RequestMapping
注解将控制器中的方法映射到HTTP。
以下代码展示了提供JSON数据的典型@RestController
:
@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) {
// ...
}
}
1)、Spring MVC自动配置
Spring Boot为Spring MVC提供了自动配置,可与大多数应用程序完美配合。
自动配置在Spring的默认设置之上添加了以下功能:
- 包含
ContentNegotiatingViewResolver
和BeanNameViewResolver
Bean。 - 支持提供静态资源,包括对WebJars的支持
- 支持
HttpMessageConverters
- 自动注册
Converter
,GenericConverter
和Formatter
Bean。 - 提供静态
index.html
- 支持自定义
Favicon
- 自动使用
ConfigurableWebBindingInitializer
bean
如果您希望保留那些Spring Boot MVC定制,并进行更多的MVC自定义(拦截器、格式化器、视图控制器和其他特性),您可以添加自己的实现了WebMvcConfigurer
类的@Configuration
类,但不需要使用@EnableWebMvc
。
如果你想提供RequestMappingHandlerMapping
, RequestMappingHandlerAdapter
,或ExceptionHandlerExceptionResolver
的自定义实例。并且仍然想保留Spring Boot MVC的定制,你可以声明一个WebMvcRegistrations
类型的bean并且使用它来提供这些组件的自定义实例。
如果你想完全控制Spring MVC,你可以在你自己的@Configuration
注解上在加上@EnableWebMvc
,或者像@EnableWebMvc
的Javadoc中描述的那样,添加自己的@Configuration
注解到Delegatingwebmvcconfiguration
上。这样springboot就不会自动配置SpringMVC,而是有你自己配置。
2)、 HttpMessageConverters
Spring MVC使用HttpMessageConverter
接口转换HTTP请求和响应。 默认不需要配置便可以使用,可以根据导入的jar自动选择转换的方式。
例如:可以使用Jackson库来将对象转为JSON,如果导入JacksonXML扩展,可以将对象转为XML,jacksonXML扩展不可用的话,就会使用JAXB转化。默认情况下,字符串都已UTF-8编码。
如果您需要添加或自定义转换器,则可以使用Spring Boot的HttpMessageConverters类,以下:
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;
@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}
上下文中存在的所有HttpMessageConverter
bean都将添加到转换器列表中。 您也可以用相同的方法覆盖默认转换器。
3)、自定义JSON序列化和反序列化器
如果使用Jackson序列化和反序列化JSON数据,则可能要编写自己的JsonSerializer
和JsonDeserializer
类。 自定义序列化程序通常是通过模块向Jackson进行注册的,但是Spring Boot提供了一种替代性的@JsonComponent
注解,这使得直接注册Spring Bean更加容易。
您可以直接在JsonSerializer
,JsonDeserializer
或KeyDeserializer
实现上使用@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中的JsonObjectSerializer和JsonObjectDeserializer。
4)、MessageCodesResolver
Spring MVC有一种生成错误代码,来呈现绑定错误的错误信息:MessageCodesResolver
。 如果设置spring.mvc.message-codes-resolver-format
属性PREFIX_ERROR_CODE
或POSTFIX_ERROR_CODE
,Spring Boot会为您创建一个(请参见DefaultMessageCodesResolver.Format中的枚举)。
5)、静态内容
默认情况下,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 /**
如下:也就是说,访问静态资源的时候不需要再URL上使用resource就可以访问,单页可以按照下面的方式重新映射。
spring.mvc.static-path-pattern=/resources/**
您还可以使用spring.resources.static-locations
属性来自定义静态资源位置(用目录位置列表替换默认值)。 Servlet上下文根路径“ /”
也会自动添加为位置。
除了前面提到的“标准”静态资源位置,Webjar内容也有特殊情况。 如果jar文件以Webjars格式打包,则jar文件的/webjars/**
路径下的资源也能访问。
注意:如果您的应用程序打包为jar,则不要使用src / main / webapp目录。 尽管此目录是一个通用标准,但它仅与war打包一起使用,并且如果生成jar,大多数构建工具都将其忽略。
Spring Boot还支持Spring MVC提供的高级资源处理功能,允许使用例如缓存清除的静态资源或对Webjars使用版本无关的URL。
要对Webjars使用版本无关的URL,请添加webjars-locator-core
依赖项。 然后声明您的Webjar。 以jQuery为例,添加“ /webjars/jquery/jquery.min.js”
将得到“ /webjars/jquery/x.y.z/jquery.min.js”
,其中x.y.z是Webjar版本。
如果使用JBoss,则需要声明webjar -locator- JBoss -vfs依赖项,而不是webjar -locator-core。否则,所有webjar都将解析为404。
要使用缓存清除,以下配置为所有静态资源配置了缓存清除解决方案,从而有效地在URL中添加了内容哈希,例如<link href =“ / css / spring-2a2d595e6ed9a0b24f027f2b63b134d6.css” />
,
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
借助为Thymeleaf和FreeMarker自动配置的ResourceUrlEncodingFilter
,可以在运行时在模板中重写资源链接。 使用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“ />
)。
6)、欢迎页面
Spring Boot支持静态和模板欢迎页面。 它首先在配置的静态内容位置中查找index.html
文件。 如果未找到,则寻找index
模板。 如果找到任何一个,它将自动用作应用程序的欢迎页面。
7)、自定义图标
与其他静态资源一样,Spring Boot在已配置的静态内容位置中查找favicon.ico。 如果存在这样的文件,它将自动用作应用程序的收藏夹图标。
8)、路径匹配和内容协商
Spring MVC可以通过将请求路径与应用程序中定义的映射进行匹配(例如,Controller方法上的@GetMapping注解)来将传入的HTTP请求映射到处理程序。
Spring Boot默认选择禁用后缀模式匹配,这意味着“ GET /projects/spring-boot.json”
之类的请求将不会与@GetMapping(“ / projects / spring-boot”)
映射进行匹配。
还有其他处理HTTP客户端的方法,这些客户端不能始终发送正确的“ Accept”请求标头。 除了使用后缀匹配,我们还可以使用查询参数来确保将诸如“ GET / projects / spring-boot?format = json”
之类的请求映射到@GetMapping(“ / projects / spring-boot”)
:
spring.mvc.contentnegotiation.favor-parameter=true
# We can change the parameter name, which is "format" by default:
# spring.mvc.contentnegotiation.parameter-name=myparam
# 我们可以注册额外类型的文件,通过下面的方式:
spring.mvc.contentnegotiation.media-types.markdown=text/markdown
后缀模式匹配已被弃用,并将在以后的版本中删除。 如果您了解了注意事项,但仍希望您的应用程序使用后缀模式匹配,则需要以下配置:
spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-suffix-pattern=true
另外,与其打开所有后缀模式,不如只支持已注册的后缀模式,这更安全
spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-registered-suffix-pattern=true
# You can also register additional file extensions/media types with:
# spring.mvc.contentnegotiation.media-types.adoc=text/asciidoc
9)、ConfigurableWebBindingInitializer
Spring MVC使用WebBindingInitializer
初始化特定请求的WebDataBinder
。 如果创建自己的ConfigurableWebBindingInitializer
@ Bean,Spring Boot会自动配置Spring MVC以使用它。
10)、模板引擎
除了REST Web服务之外,您还可以使用Spring MVC来提供动态HTML内容。 Spring MVC支持各种模板技术,包括Thymeleaf,FreeMarker和JSP。 同样,许多其他模板引擎包括它们自己的Spring MVC集成。
Spring Boot包括对以下模板引擎的自动配置支持:
如果可能,应避免使用JSP。 将它们与嵌入式servlet容器一起使用时,存在几个已知的限制。
当你使用这些模板引擎的默认配置,会在src/main/resources/templates
路径下查询模板
根据您运行应用程序的方式,IntelliJ IDEA对类路径的排序方式不同。 与使用Maven或Gradle或从打包的jar运行应用程序时,从IDE的主要方法运行应用程序的顺序会有所不同。 这可能会导致Spring Boot无法在类路径上找到模板。 如果遇到此问题,可以在IDE中重新排序类路径,以首先放置模块的类和资源。 或者,您可以配置模板前缀以搜索类路径上的每个模板目录,如下所示:classpath *:/ templates /
。
11)、错误处理
默认情况下,Spring Boot提供了一个/ error映射,以一种明智的方式处理所有错误,并且在servlet容器中被注册为“全局”错误页面。 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。 对于浏览器客户端,有一个“ whitelabel”错误视图以HTML格式呈现相同的数据(要对其进行自定义,请添加一个可解决错误的视图)。 要完全替换默认行为,可以实现ErrorController
并注册该类型的bean定义,或者添加类型为ErrorAttributes
的bean以使用现有机制,但替换其内容。
BasicErrorController
可用作自定义ErrorController
的基类。 如果要为新的文本类型添加处理程序(默认是专门处理text / html
并为其他所有内容提供后备功能),则此功能特别有用。 为此,请继承BasicErrorController
,创建一个有produces
属性的公共方法并使用@RequestMapping
注解,将这个类注册为bean。
您还可以定义一个带有@ControllerAdvice
注解的类,针对特定的控制器和/或异常类型返回JSON文档,如以下示例所示:
@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice 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);
}
}
在前面的示例中,如果与AcmeController在同一包中定义的controller抛出YourException类型的异常,则将使用CustomErrorType POJO的JSON表示形式而不是ErrorAttributes表示形式。
自定义错误页
如果要显示给定状态代码的自定义HTML错误页面,可以将文件添加到/ error文件夹。 错误页面可以是静态HTML(即添加到任何静态资源文件夹下),也可以使用模板来构建。 文件名应为确切的状态代码或系列掩码。
例如,要将404映射到静态HTML文件,您的文件夹结构如下所示
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
对于更复杂的映射,还可以添加实现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
方法和@ControllerAdvice
。 然后,ErrorController
拾取所有未处理的异常。就是说,使用@ExceptionHandler
和@ControllerAdvice
来处理一些特定的异常,剩下的交由ErrorController
处理。
在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"));
}
}
如果您在错误页面上注册了一个最终由过滤器处理的路径(这在某些非Spring Web框架(如Jersey和Wicket)中很常见),则必须将过滤器显式注册为ERROR调度程序,如 下面的例子:
@Bean
public FilterRegistrationBean myFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new MyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
return registration;
}
注意,默认的FilterRegistrationBean
不包含错误调度程序类型。
注意:当Spring Boot部署到servlet容器时,将使用其错误页面过滤器将具有错误状态的请求转发到相应的错误页面。 如果尚未提交响应,则只能将请求转发到正确的错误页面。 缺省情况下,WebSphere Application Server 8.0及更高版本在成功完成servlet的服务方法后提交响应。 您应该通过将com.ibm.ws.webcontainer.invokeFlushAfterService
设置为false来禁用此行为。
12)、Spring HATEOAS
如果您开发使用超媒体的RESTful API,Spring Boot会为Spring HATEOAS提供自动配置,该配置可与大多数应用程序很好地兼容。 自动配置取代了使用@EnableHypermediaSupport
的需要,并注册了许多bean来简化基于超媒体的应用程序的构建,包括一个LinkDiscoverers
(用于客户端支持)和一个ObjectMapper
,该对象被配置为将响应正确地编组为所需的表示形式。 通过设置各种spring.jackson.*
属性,或通过Jackson2ObjectMapperBuilder bean
(如果存在)来定制ObjectMapper
。
13)、CORS支持
Cross-origin resource sharing 跨域资源共享(CORS)是由大多数浏览器实施的W3C规范,使您可以灵活地指定对哪种类型的跨域请求进行授权,而不是使用诸如IFRAME或JSONP之类的安全性较低,功能较弱的方法。 。
从4.2版本开始,Spring MVC支持CORS。 在Spring Boot应用程序中使用带有@CrossOrigin
注解的控制器方法CORS配置不需要任何特定的配置。 可以通过使用自定义的addCorsMappings(CorsRegistry)方法注册WebMvcConfigurer bean来定义全局CORS配置,如以下示例所示:
@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**");
}
};
}
}
2、嵌入式Servlet容器支持
Spring Boot包括对嵌入式Tomcat
,Jetty
和Undertow
服务器的支持。 大多数开发人员使用适当的“启动器”来获取完全配置的实例。 默认情况下,嵌入式服务器在端口8080上侦听HTTP请求。
1)、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
类进行完全控制。
无序地离开Filter通常是安全的。如果需要指定顺序,你应该在Filter
上使用@Order
注解或者实现Ordered
接口。
您不能通过使用@Order
注解Filter的bean方法来配置Filter的顺序
如果您无法更改Filter类以添加@Order
或实现Ordered
,则必须为Filter定义一个FilterRegistrationBean
并使用setOrder(int)
方法设置注册bean的顺序.
避免配置一个在Ordered.HIGHEST_PRECEDENCE
上读取请求正文的过滤器,因为它可能与应用程序的字符编码配置不符
如果Servlet过滤器包装了请求,则应使用小于或等于OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER
的顺序对其进行配置
要查看应用程序中每个Filter
的顺序,请为Web日志记录组(logging.level.web = debug
)启用调试级别的日志记录。 然后,将在启动时记录已注册过滤器的详细信息,包括其顺序和URL模式。
注册Filter Bean时要小心,因为它们是在应用程序生命周期中很早就初始化的。 如果需要注册与其他bean交互的Filter,请考虑改用DelegatingFilterProxyRegistrationBean。
2)、Servlet Context 初始化
嵌入式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在独立容器中无效,而是使用容器的内置发现机制。
3)、ServletWebServerApplicationContext
在后台,Spring Boot使用另一种类型的ApplicationContext
来支持嵌入式Servlet容器。 ServletWebServerApplicationContext是WebApplicationContext
的一种特殊类型,它通过搜索单个ServletWebServerFactory
bean来自我引导。 通常,已经自动配置了TomcatServletWebServerFactory
,JettyServletWebServerFactory
或UndertowServletWebServerFactory
。
通常,您不需要了解这些实现类。 大多数应用程序都是自动配置的,并且为您创建了相应的ApplicationContext和ServletWebServerFactory。
4)、自定义嵌入式Servlet容器
可以使用Spring Environment
属性来配置常见的servlet容器设置。 通常,您将在application.properties
文件中定义属性。
常用服务器设置包括:
- 网络设置:侦听传入HTTP请求的端口(server.port),绑定到server.address的接口地址,等等。
- 会话设置:会话是否持久(
server.servlet.session.persistent
),会话超时(server.servlet.session.timeout
),会话数据的位置(server.servlet.session.store-dir
)和会话cookie 配置(server.servlet.session.cookie.*
)。 - 错误管理:错误页面的位置(
server.error.path
)等。 - SSL
- HTTP compression
Spring Boot尝试尽可能多地公开通用设置,但并不是全部实现。 对于这些情况,专用名称空间提供了特定于服务器的自定义项(请参阅server.tomcat和server.undertow)。 例如,可以使用嵌入式servlet容器的特定功能配置访问日志。
有关完整列表,请参见ServerProperties类。
程序化定制
如果需要以编程方式配置嵌入式Servlet容器,则可以注册一个实现WebServerFactoryCustomizer
接口的Spring Bean。 WebServerFactoryCustomizer
提供对ConfigurableServletWebServerFactory
的访问,其中包括许多自定义设置方法。 以下示例显示以编程方式设置端口:
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);
}
}
TomcatServletWebServerFactory
,JettyServletWebServerFactory
和UndertowServletWebServerFactory
是ConfigurableServletWebServerFactory
的专用变体,分别具有针对Tomcat,Jetty和Undertow的其他自定义设置方法。
直接自定义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;
}
提供了许多配置选项的设置器。 如果您需要做一些更奇特的操作,还提供了几种受保护的方法“挂钩”。 有关详细信息,请参见 source code documentation
5)、JSP的局限性
当运行使用嵌入式servlet容器(并打包为可执行档案)的Spring Boot应用程序时,JSP支持存在一些限制。
- 对于Jetty和Tomcat,如果使用war打包,它应该可以工作。 与
java -jar
一起启动时,可执行的war将起作用,并且还将可部署到任何标准容器中。 JSP不支持jar打包。 - Undertow不支持JSP。
- 创建定制的
error.jsp
页面不会覆盖默认视图以进行错误处理。 需使用上面提到的自定义错误页。
3、嵌入式反应式服务器支持
Spring Boot包含对以下嵌入式反应式Web服务器的支持:Reactor Netty,Tomcat,Jetty和Undertow。 大多数开发人员使用适当的“启动器”来获取完全配置的实例。 默认情况下,嵌入式服务器在端口8080上侦听HTTP请求。
4、反应性服务器资源配置
当自动配置Reactor Netty或Jetty服务器时,Spring Boot将创建特定的bean,这些bean将向服务器实例提供HTTP资源:ReactorResourceFactory
或JettyResourceFactory
。
默认情况下,这些资源还将与Reactor Netty和Jetty客户端共享,以实现最佳性能,具体如下:
- 服务器和客户端使用相同的技术
- 客户端实例是使用Spring Boot自动配置的
WebClient.Builder
bean构建的
通过提供自定义的ReactorResourceFactory
或JettyResourceFactory
bean,开发人员可以覆盖Jetty和Reactor Netty的资源配置-这将同时应用于客户端和服务器。