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,因此您可以了解如何进行设置。

更多精彩内容 ~~~~ 关注一波公众号

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
即使拥有良好的工具和优秀技术,应用软件开发也是困难重重。应用开发往往牵扯到方方面面,每件事情都难以控制,而且,开发周期也很难把握(除非它的确是一个重量级的复杂应用,倒也有情可原)。Spring提供了一种轻量级的解决方案,用于建立“快装式企业应用”。在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去。 你可以把Spring当作一个潜在的一站式企业应用。或者,把Spring看作一个标准开发组件,根据自己的需要,只取用它的部分组件使用而无需涉及其他。例如,你可以利用控制反转容器在前台的展现层使用Struts,还可以只使用 Hibernate集成编码 或是 JDBC抽象层 去处理数据存储。Spring被设计成(并将继续保持)无侵入性的方式,意味着应用几乎不需要对框架进行依赖(或根据实际使用的范围,将依赖做到最小)。 本文档是一份对Spring特性的参考指南,并且仍在增进中,如果你有任何的要求或建议,请把它们发表至用户邮件组或论坛:http://www.sf.net/projects/springframework 在我们继续之前,有些许感谢的话要说:为了生成Hibernate参考指南,Chris Bauer(Hibernate 项目组成员)准备和调整了DocBook-XSL软件,同时也让我们生成了该文档。同样需要感谢Russell Healy,对于某些问题,他提供了广泛而有价值的建议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值