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数据,您可能希望编写自己的类JsonSerializer
和JsonDeserializer
类。
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/**"); } }; } }