Spring Boot 參考指南(開發Web應用程序)

27. 開發Web應用程序

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

27.1 Spring Web MVC Framework

Spring Web MVC框架(一般簡稱爲「Spring MVC」)是一個豐富的「模型視圖控制器」Web框架,Spring MVC容許你建立特殊的@Controller@RestController bean來處理傳入的HTTP請求,控制器中的方法經過使用@RequestMapping註解映射到HTTP。java

下面的代碼顯示了一個典型的提供JSON數據的@RestControllerreact

@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

27.1.1 Spring MVC自動配置

Spring Boot爲大多數應用程序提供了良好的Spring MVC自動配置。git

自動配置在Spring的默認設置之上添加了如下特性:github

  • 包含ContentNegotiatingViewResolverBeanNameViewResolver bean。
  • 支持提供靜態資源,包括支持WebJars(稍後將在本文中介紹)。
  • ConverterGenericConverterFormatter bean的自動註冊。
  • 支持HttpMessageConverters(稍後將在本文中介紹)。
  • MessageCodesResolver的自動註冊(稍後將在本文中介紹)。
  • 靜態index.html支持。
  • 支持自定義圖標(稍後將在本文中介紹)。
  • 自動使用ConfigurableWebBindingInitializer bean(稍後將在本文中介紹)。

若是你想保留Spring Boot MVC特性,而且但願添加額外的MVC配置(攔截器、格式化器、視圖控制器和其餘特性),你能夠添加本身的@Configuration類的WebMvcConfigurer類型,但沒有@EnableWebMvc,若是但願提供RequestMappingHandlerMappingRequestMappingHandlerAdapterExceptionHandlerExceptionResolver的定製實例,能夠聲明一個WebMvcRegistrationsAdapter實例來提供這些組件。web

若是你想徹底控制Spring MVC,能夠添加本身的@EnableWebMvc註解的@Configurationspring

27.1.2 HttpMessageConverters

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都被添加到轉換器列表中,你還能夠以一樣的方式覆蓋默認轉換器。

27.1.3 自定義JSON序列化器和反序列化器

若是使用Jackson序列化和反序列化JSON數據,你可能想要編寫本身的JsonSerializerJsonDeserializer類,定製序列化器一般經過模塊向Jackson註冊,可是Spring Boot提供了一個替代的@JsonComponent註解,使直接註冊Spring bean變得更容易。

你能夠直接在JsonSerializerJsonDeserializer實現上使用@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還提供了JsonObjectSerializerJsonObjectDeserializer基類,這些基類在序列化對象時爲標準Jackson版本提供了有用的替代方法,有關詳細信息,請參閱Javadoc中的JsonObjectSerializerJsonObjectDeserializer

27.1.4 MessageCodesResolver

Spring MVC有一個生成錯誤代碼的策略,用於從綁定錯誤中呈現錯誤消息:MessageCodesResolver,若是你設置spring.mvc.message-codes-resolver.format屬性PREFIX_ERROR_CODEPOSTFIX_ERROR_CODE,Spring Boot爲你建立一個(參見DefaultMessageCodesResolver.Format中的枚舉)。

27.1.5 靜態內容

默認狀況下,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 參考文檔中進行了詳細描述。

27.1.6 歡迎頁面

Spring Boot支持靜態和模板歡迎頁面,它首先查找index.html文件中的配置靜態內容位置,若是其中一個沒有找到,則查找index模板,若是找到任何一個,它將自動用做應用程序的歡迎頁面。

27.1.7 自定義圖標

Spring Boot在配置的靜態內容位置和類路徑根目錄中查找favicon.ico(按順序),若是存在這樣的文件,它將自動用做應用程序的圖標。

27.1.8 路徑匹配和內容協商

Spring MVC能夠經過查看請求路徑並將其與應用程序中定義的映射匹配(例如,控制器方法上的@GetMapping註解),將傳入的HTTP請求映射處處理程序。


上一篇:日誌記錄

下一篇:安全

相關文章
相關標籤/搜索