Spring Boot:(十一)Rest映射 & 请求映射原理

3 请求参数处理

3.1 请求映射

  • @xxxMapping
  • Rest风格支持(使用HTTP请求方式动词来表示对资源的操作
    • 以前:/getUser获取用户、/deleteUser删除用户、/editUser修改用户
    • 现在:/user GET-获取用户、DELETE-删除用户、PUT-修改用户、POST-保存用户
    • 核心Filter;HiddenHttpMethodFilter
      • 用法:表单method=post,隐藏域_method=put
package com.study.boot05web01.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public String getUser(){
        return "GET-张三";
    }

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public String saveUser(){
        return "POST-张三";
    }

    @RequestMapping(value = "/user", method = RequestMethod.PUT)
    public String putUser(){
        return "PUT-张三";
    }

    @RequestMapping(value = "/user", method = RequestMethod.DELETE)
    public String deleteUser(){
        return "DELETE-张三";
    }
}

3.2 请求映射原理

所有请求都会经过DispatcherServlet:
在这里插入图片描述

SpringMVC功能分析都从org.springframework.web.servlet.DispatcherServletdoDispatch方法开始

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

    try {
        ModelAndView mv = null;
        Object dispatchException = null;

        try {
            processedRequest = this.checkMultipart(request);
            multipartRequestParsed = processedRequest != request;
            //找到哪个handler进行处理
            mappedHandler = this.getHandler(processedRequest);

			//handlerMappings:处理器映射。 /xxx ->>> xxxxx
		}
	}
}

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
    if (this.handlerMappings != null) {
        Iterator var2 = this.handlerMappings.iterator();

        while(var2.hasNext()) {
            HandlerMapping mapping = (HandlerMapping)var2.next();
            HandlerExecutionChain handler = mapping.getHandler(request);
            if (handler != null) {
                return handler;
            }
        }
    }

    return null;
}

在这里插入图片描述

RequestMappingHandlerMapping:保存了所有@RequestMappinghandler的映射规则。
在这里插入图片描述

所有的请求映射都在HandlerMapping中

  • Springboot自动配置欢迎页的HandlerMapping。访问/能访问到index.html
  • 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息
    • 如果有就找到这个请求对应的handler
    • 如果没有就是下一个HandlerMapping
  • 我们需要一些自定义的映射原理,我们也可以自己给容器中放HandlerMapping
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值