Spring Boot很是适合web应用程序开发,经过使用嵌入式Tomcat、Jetty、Undertow或Netty,你能够建立一个自包含的HTTP服务器。大多数web应用程序都使用spring-boot-starter-web
模块来快速启动和运行,你还能够选择使用spring-boot-starter-webflux
模块构建reactive web应用程序。css
若是你尚未开发过一个Spring Boot web应用程序,你能够按照入门部分中的“Hello World!”示例进行操做。html
Spring Web MVC框架(一般简称为“Spring MVC”)是一个丰富的“模型视图控制器”Web框架,Spring MVC容许你建立特殊的@Controller
或@RestController
bean来处理传入的HTTP请求,控制器中的方法经过使用@RequestMapping
注解映射到HTTP。java
下面的代码显示了一个典型的提供JSON数据的@RestController
:react
@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框架的一部分,在参考文档中能够找到详细信息,在spring.io/guides还提供了几个介绍Spring MVC的指南。jquery
Spring Boot为大多数应用程序提供了良好的Spring MVC自动配置。git
自动配置在Spring的默认设置之上添加了如下特性:github
ContentNegotiatingViewResolver
和BeanNameViewResolver
bean。Converter
、GenericConverter
和Formatter
bean的自动注册。HttpMessageConverters
(稍后将在本文中介绍)。MessageCodesResolver
的自动注册(稍后将在本文中介绍)。index.html
支持。ConfigurableWebBindingInitializer
bean(稍后将在本文中介绍)。若是你想保留Spring Boot MVC特性,而且但愿添加额外的MVC配置(拦截器、格式化器、视图控制器和其余特性),你能够添加本身的@Configuration
类的WebMvcConfigurer
类型,但没有@EnableWebMvc
,若是但愿提供RequestMappingHandlerMapping
、RequestMappingHandlerAdapter
或ExceptionHandlerExceptionResolver
的定制实例,能够声明一个WebMvcRegistrationsAdapter
实例来提供这些组件。web
若是你想彻底控制Spring MVC,能够添加本身的@EnableWebMvc
注解的@Configuration
。spring
Spring MVC使用HttpMessageConverter
接口转换HTTP请求和响应,合理的默认值是开箱即用的,例如,对象能够自动转换为JSON(经过使用Jackson库)或XML(若是可用,可使用Jackson XML扩展,或者若是Jackson XML扩展不可用,可使用JAXB),默认状况下,字符串是用UTF-8
编码的。segmentfault
若是须要添加或定制转换器,可使用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都被添加到转换器列表中,你还能够以一样的方式覆盖默认转换器。
若是使用Jackson序列化和反序列化JSON数据,你可能想要编写本身的JsonSerializer
和JsonDeserializer
类,定制序列化器一般经过模块向Jackson注册,可是Spring Boot提供了一个替代的@JsonComponent
注解,使直接注册Spring bean变得更容易。
你能够直接在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中的JsonObjectSerializer和JsonObjectDeserializer。
Spring MVC有一个生成错误代码的策略,用于从绑定错误中呈现错误消息:MessageCodesResolver
,若是你设置spring.mvc.message-codes-resolver.format
属性PREFIX_ERROR_CODE
或POSTFIX_ERROR_CODE
,Spring Boot为你建立一个(参见DefaultMessageCodesResolver.Format中的枚举)。
默认状况下,Spring Boot从类路径或ServletContext
根目录中提供静态内容,目录名为/static
(或/public
或/resources
或/META-INF/resources
),它使用来自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
属性定制静态资源位置(用目录位置列表替换默认值),根Servlet上下文路径"/"
也做为位置自动添加。
除了前面提到的“标准”静态资源位置以外,Webjars内容还有一个特殊的例子,任何在/webjars/**
中具备路径的资源均可以从jar文件中获取,若是它们被打包成webjars格式的话。
若是你的应用程序打包为jar,那么不要使用
src/main/webapp
目录,虽然这个目录是一个通用标准,但它只与war打包一块儿工做,而且若是你生成一个jar,它会被大多数构建工具默默忽略。
Spring Boot还支持Spring MVC提供的高级资源处理特性,容许用例(好比cache-busting的静态资源)或使用webjar的版本无关url。
要为webjar使用版本无关的url,请添加webjar-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
,不然,全部Webjars解析为404
。
为了使用cache busting,下面的配置为全部静态资源配置cache busting解决方案,有效地添加了内容散列,例如<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
,在URL中:
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"/>
)。
有关更多支持的选项,请参阅ResourceProperties。
这个特性已经在一个专门的 博客帖子和Spring Framework 参考文档中进行了详细描述。
Spring Boot支持静态和模板欢迎页面,它首先查找index.html
文件中的配置静态内容位置,若是其中一个没有找到,则查找index
模板,若是找到任何一个,它将自动用做应用程序的欢迎页面。
Spring Boot在配置的静态内容位置和类路径根目录中查找favicon.ico
(按顺序),若是存在这样的文件,它将自动用做应用程序的图标。
Spring MVC能够经过查看请求路径并将其与应用程序中定义的映射匹配(例如,控制器方法上的@GetMapping
注解),将传入的HTTP请求映射处处理程序。