Spring Web MVC Framework mvc框架

1.The “Spring Web MVC Framework”

Spring MVC 框架是一种模型视图控制器框架。

其通过创建@Controller或者@RestController beans实例来处理进来的http请求。

控制器中的方法通过@RequestMapping来映射。

下面的代码示例配置了一个@RestController来处理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框架核心的一部分,更多细节可以查看官方文档 https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/web.html#mvc

2.Spring MVC Auto-configuration

Springboot为spring MVC提供自动配置,适用于大多数应用程序。

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

  • 包含 ContentNegotiatingViewResolver 和 BeanNameViewResolver 实例
  • 支持处理静态资源
  • 自动注册Converter,GenericConverter,Formatter实例
  • 支持HttpMessageConverters
  • 自动注册MessageCodesResolver
  • 支持静态的jindex.html

如果您想保留Spring Boot MVC功能并且想要添加其他 MVC配置(拦截器,格式化程序,视图控制器和其他功能),您可以添加自己的@Configuration注解,返回类型WebMvcConfigurer,并且不需要 @EnableWebMvc

3.HttpMessageConverters(消息转换器)

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

明智的默认设置包含在开箱即用中。例如,对象可以自动转换为JSON(通过使用Jackson库)或XML(如果可用,则使用Jackson XML扩展,或者如果Jackson XML扩展不可用,则使用JAXB)。

默认情况下,字符串是以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都将添加到转换器列表中。您也可以以相同的方式覆盖默认转换器。

4.自定义JSON序列化程序和反序列化程序

如果您使用Jackson序列化和反序列化JSON数据,您可能希望编写自己的JsonSerializerJsonDeserializer类。

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> {
        // ...
    }

}

5.静态内容

默认情况下,Spring Boot从classpath路径中的/static( /public/resources/META-INF/resources目录或者ServletContext根目录中提供静态内容

它使用Spring MVC中的ResourceHttpRequestHandler,以便您可以通过addResourceHandlers方法添加自己的WebMvcConfigurer来修改该行为并覆盖该 方法。

6.路径匹配

Spring MVC可以通过查看请求路径并将其与应用程序中定义的映射(例如,@GetMapping Controller方法上的注释)相匹配,将传入的HTTP请求映射到处理程序

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

7.全局错误处理

@ControllerAdvice 可以用于处理来自控制器的所有未捕获异常,指定返回数据。
@ControllerAdvice()
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);
    }

}

8.CORS支持

从4.2版本开始,Spring MVC支持跨域访问。在Sprinboot应用程序@Controller中的方法使用@CrossOrigin便可以支持跨域。也可以全局设置跨域处理(注册bean WebMvcConfigurer)

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**");
            }
        };
    }
}

 

猜你喜欢

转载自www.cnblogs.com/gc65/p/10628706.html