• 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/**");
                }
            };
        }
    }

     

  • 相关阅读:
    oracle之sqlplus讲解
    oracle数据库--启动和关闭
    linux下使用SSL代理(SSLedge)
    Titanium系列--利用js动态获取当前时间
    Titanium系列--利用Titanium开发android App实战总结
    Titanium系列--我常用的Titanium的快捷键(持续更新中。。)
    Titanium系列--安装Titanium Studio 中的Android SDK,JDK以及环境变量的配置(二)
    Titanium系列--Titanium的简介、Titanium Studio安装和配置(一)
    Happymenu新的开始
    对IEnumerable<T>和IQueryable<T>的一点见解
  • 原文地址:https://www.cnblogs.com/gc65/p/10628706.html
Copyright © 2020-2023  润新知