目录
  • 请求方式
    • 非Rest风格
  • 使用Rest风格
    • 表单提交
    • 过程分析
  • 请求映射过程分析

    请求方式

    Spring Boot支持Rest风格:使用HTTP请求方式的动词来表示对资源的操作

    非Rest风格

    以前这样写接口:

    /getUser   获取用户    
    /deleteUser 删除用户    
    /updateUser  修改用户      
    /saveUser 保存用户
    	@RequestMapping(value = "/getUser", method = RequestMethod.GET)
        public String getUser() {
            return "GET";
        }
        @RequestMapping(value = "/deleteUser", method = RequestMethod.POST)
        public String deleteUser() {
            return "POST";
        }
        @RequestMapping(value = "/updateUser", method = RequestMethod.POST)
        public String updateUser() {
            return "POST";
        }
        @RequestMapping(value = "/saveUser", method = RequestMethod.POST)
        public String saveUser() {
            return "POST";
        }

    使用Rest风格

    使用Rest风格,则这样写接口:

     /user    GET-获取用户    DELETE-删除用户     PUT-修改用户      POST-保存用户
        @GetMapping("/user")
        public String getUser() {
            return "GET";
        }
        @PostMapping("/user")
        public String saveUser() {
            return "POST";
        }
        @PutMapping("/user")
        public String putUser() {
            return "PUT";
        }
        @DeleteMapping("/user")
        public String deleteUser() {
            return "DELETE";
        }

    表单提交

    通过表单方式提交请求,请求类型只能支持Get与Post

    若表单提交要使用REST风格,则表单请求方式使用Post,添加隐藏域 _method=put、 _method=delete方式来支持Rest风格

    示例如下:

    <form action="/user" method="post">
    	<input name="_method" type="hidden" value="delete"/>
        <input value="REST提交" type="submit"/>
    </form>

    SpringBoot配置文件中开启页面表单的Rest功能

    spring:
      mvc:
        hiddenmethod:
          filter:
            enabled: true

    过程分析

    首先是从自动配置类WebMvcAutoConfiguration开始,其中的hiddenHttpMethodFilter方法入手,请求首先被该方法拦截

    Java Spring Boot请求方式与请求映射过程分析

    接着创建OrderedHiddenHttpMethodFilter对象,其又继承HiddenHttpMethodFilter

    Java Spring Boot请求方式与请求映射过程分析

    HiddenHttpMethodFilter中的doFilterInternal核心方法进行了相关拦截操作,要求是Post请求并且请求正常,然后获取请求参数_method

    Java Spring Boot请求方式与请求映射过程分析

    request.getParameter(this.methodParam)从请求中获取_method参数进行判断拦截,故可修改默认_method,自定义隐藏参数。

       @Bean
        public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
            HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
            methodFilter.setMethodParam("_mymethod");
            return methodFilter;
        }
    

    请求映射过程分析

    首先一个请求肯定会经过HttpServlet类的doGet()doPost()等方法,当然不一定会执行,但其子类肯定会有对其的具体实现,其实现类如下:

    Java Spring Boot请求方式与请求映射过程分析

    推测+大概看源码得出Spring Boot的一个请求会经过FrameworkServlet类的doGet()方法

    Java Spring Boot请求方式与请求映射过程分析

    processRequest方法又调用了doService方法

    Java Spring Boot请求方式与请求映射过程分析

    doService方法是一个接口,FrameworkServlet并没有具体实现

    Java Spring Boot请求方式与请求映射过程分析

    不过DispatcherServlet对其经行了具体实现,doService方法中又调用doDispatch核心请求分发方法

    Java Spring Boot请求方式与请求映射过程分析

    doDispatch方法中又寻找当前请求使用哪个Handler(处理器映射器)

    Java Spring Boot请求方式与请求映射过程分析

    Spring Boot默认已配置有如下5种处理器映射器。这里会挨个尝试所有的HandlerMapping看是否有匹配的请求

    Java Spring Boot请求方式与请求映射过程分析

    在Spring Boot启动时,相关处理器映射器已经将请求关系进行了绑定,保存了所有@RequestMapping 和handler的映射规则

    如下:某Controller层的/index请求方法就与RequestMappingHandlerMapping进行了关联绑定

    Java Spring Boot请求方式与请求映射过程分析

    接着再执行mapping.getHandler(request)

    Java Spring Boot请求方式与请求映射过程分析

    执行this.getHandlerInternal(request),来到AbstractHandlerMethodMapping类重写的方法

    Java Spring Boot请求方式与请求映射过程分析

    执行 super.getHandlerInternal(request);得到当前请求Path

    Java Spring Boot请求方式与请求映射过程分析

    执行this.lookupHandlerMethod(lookupPath, request);进行判断当前请求的是具体那个方法,即请求对应的handler,找到后并返回。

    Java Spring Boot请求方式与请求映射过程分析

    到此,Spring Boot的请求映射过程解析完毕。

    最终,请求映射过程中涉及的类如下:

    Java Spring Boot请求方式与请求映射过程分析

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。