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請求映射處處理程序。