spring boot --开发web应用程序

拈花ヽ惹草 提交于 2020-03-26 09:47:33

3 月,跳不动了?>>>

Spring MVC 自动配置

Spring Boot 提供了适用于大多数 Spring MVC 应用的自动配置

自动配置在 Spring 默认功能上添加了以下功能:

  • 引入 ContentNegotiatingViewResolver 和 BeanNameViewResolver bean。
  • 支持服务静态资源,包括对 WebJar 的支持。
  • 自动注册 ConverterGenericConverter 和 Formatter bean。
  • 支持 HttpMessageConverter
  • 自动注册 MessageCodesResolver
  • 支持静态 index.html。
  • 支持自定义 Favicon 。
  • 自动使用 ConfigurableWebBindingInitializer bean。

HttpMessageConverters

Spring MVC 使用 HttpMessageConverter 接口来转换 HTTP 的请求和响应

 

自定义 JSON Serializer 和 Deserializer

自定义序列化器(serializer)的做法通常是通过一个模块来注册 Jackson, 然而 Spring Boot 提供了一个备选的 @JsonComponent 注解,它可以更加容易地直接注册 Spring Bean。

MessageCodesResolver

Spring MVC 有一个从绑定错误中生成错误码的策略,用于渲染错误信息:MessageCodesResolver。如果设置了 spring.mvc.message-codes-resolver.format 属性值为 PREFIX_ERROR_CODE 或 POSTFIX_ERROR_CODE,Spring Boot 将为你创建该策略。

静态内容

默认情况下,Spring Boot 将在 classpath 或者 ServletContext 根目录下从名为 /static (/public/resources 或 /META-INF/resources)目录中服务静态内容。它使用了 Spring MVC 的 ResourceHttpRequestHandler,因此您可以通过添加自己的 WebMvcConfigurerAdapter 并重写 addResourceHandlers 方法来修改此行为。

默认情况下,资源被映射到 /**,但可以通过 spring.mvc.static-path-pattern 属性调整。比如,将所有资源重定位到 /resources/**

spring.mvc.static-path-pattern=/resources/**

如果您的应用程序要包成 jar,请不要使用 src/main/webapp 目录。虽然此目录是一个通用标准,但它只适用于 war 打包,如果生成的是一个 jar,它将被绝大多数的构建工具所忽略。

欢迎页面

Spring Boot 支持静态和模板化的欢迎页面。它首先在配置的静态内容位置中查找 index.html 文件。如果找不到,则查找 index 模板。

自定义 Favicon

Spring Boot 在配置的静态内容位置和根 classpath 中查找 favicon.ico(按顺序)

路径匹配与内容协商

Spring MVC 可以通过查看请求路径并将其与应用程序中定义的映射相匹配,将传入的 HTTP 请求映射到处理程序。

Spring Boot 默认选择禁用后缀模式匹配,这意味着像 "GET /projects/spring-boot.json" 这样的请求将不会与 @GetMapping("/projects/spring-boot") 映射匹配。

模板引擎

Spring Boot 包含了以下的模板引擎的自动配置支持:

错误处理

可以定义一个带有 @ControllerAdvice 注解的类来自定义为特定控制器或异常类型返回的 JSON 文档:

@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice 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);
    }

}
如果同包下定义的控制器 AcmeController 抛出了 YourException,则将使用 CustomerErrorType 类型的 POJO 来代替 ErrorAttributes 做 JSON 呈现

自定义错误页面

想在自定义的 HTML 错误页面上显示给定的状态码,请将文件添加到 /error 文件夹中。错误页面可以是静态 HTML(添加在任意静态资源文件夹下) 或者使用模板构建。文件的名称应该是确切的状态码或者一个序列掩码。

要将 404 映射到一个静态 HTML 文件,文件夹结构可以如下

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>
 

映射到 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"));
    }

}

 

CORS 支持

跨域资源共享(Cross-origin resource sharing,CORS)是大多数浏览器实现的一个 W3C 规范

在 Spring Boot 应用程序中使用 @CrossOrigin 注解配置控制器方法启用 CORS。还可以通过注册一个 WebMvcConfigurer bean 并自定义 addCorsMappings(CorsRegistry) 方法来定义全局 CORS 配置

@Configuration

public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**");
            }
        };
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!