Spring-2.0.0.M3超詳細文檔(第二彈)

開發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 可以讓你創建特殊的@ControllerRestControllerBean 來處理傳入的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類.RequestMappingHandlerMappingRequestMappingHandlerAdapterExceptionHandlerExceptionResolver的自定義實例,則可以聲明一個提供此類組件的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數據,則可能需要編寫自己的JsonSerializerJsonDeserializer類.自定義序列化程序通常是通過模塊向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還提供了JsonObjectSerializerJsonObjectDeserializer基類,這些基類在序列化對象時爲標準Jackson版本提供了有用的替代方法。有關詳細信息,請參見Javadoc。

處理消息碼 - MessageCodesResolver

Spring MVC有一種生成錯誤代碼以從綁定錯誤中呈現錯誤消息的策略:MessageCodesResolver
如果您設置spring.mvc.message-codes-resolver.format屬性PREFIX_ERROR_CODEPOSTFIX_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應用程序中使用帶有@CrossOrigincontroller 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-webspring-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使用HttpMessageReaderHttpMessageWriter接口轉換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將在名爲ServletServletRegistrationServletRegistrationBean類型的@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的ServletFilter或Servlet * Listener實例都將在嵌入式容器中註冊。如果要在配置過程中引用application.properties中的值,這可能特別方便。

默認情況下,如果上下文僅包含單個Servlet,它將被映射到 /。對於多個Servlet Bean,該Bean名稱將用作路徑前綴。過濾器將映射到 / *

如果基於約定的映射不夠靈活,則可以使用ServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBean類進行控制。

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容器。ServletWebServerApplicationContextWebApplicationContext的一種特殊類型,它通過搜索單個ServletWebServerFactory bean來自我引導。通常,將自動配置TomcatServletWebServerFactoryJettyServletWebServerFactoryUndertowServletWebServerFactory

通常,您不需要了解這些實現類。大多數應用程序將被自動配置,並且將代表您創建適當的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 to server.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

如果上述定製技術太有限,則可以自己註冊TomcatServletWebServerFactoryJettyServletWebServerFactoryUndertowServletWebServerFactory 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,因此您可以瞭解如何進行設置。

更多精彩內容 ~~~~ 關注一波公衆號

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章