请求映射

rest的使用与原理

  • @xxxMapping;

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

    • 以前: /getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
    • 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户
    • 核心Filter;HiddenHttpMethodFilter
      • 用法: 表单method=post,隐藏域 _method=put
      • SpringBoot中手动开启
    • 扩展:如何把_method 这个名字换成我们自己喜欢的。

img

基于表单提交的RESTful原理

  1. 表单提交会带上[_method = put]
  2. 请求过来会被HiddenHttpMethodFilter拦截
  3. 处理请求(如果请求正常,才会放行)

img

  1. 然后内部进行处理,判断是否有请求。然后将请求转换为大写

img

  1. 包装原生request)将原生的request转换成为HttpMethodRequestWrapper请求,然后HttpMethodRequestWrapper会重写HttpRequest的个体、Method 方法

在控制层请求发起的流程

在请求处理之前,需要先执行Filter。然后HiddenHttpMethodFilter将原生请求的getMethod重写了变成delete。 然后此时当进行请求的时候。getMethod已经变成了delete/put/,,,就与请求匹配了。

img

DispatcherServlet请求原理

img

  1. 他是处理所有请求的开始
  2. 他没有重写了doGet和doPost,在FrameworkServelt中调用了doGet和doPost。然后又调用了processRequest()。
  3. processRequest又调用类中的doService方法 。最终在DispacherSerlvet中做了doService的实现
  4. 在DispacherServlet中有一个doDisptch()就是请求转发。然后再doDisptch中才是一些真正有功能的我们需要的方法

img

  1. 所以说doDispach()才是每个请求都会调用的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
Exception dispatchException = null;

try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);

// 找到当前请求使用哪个Handler(Controller的方法)处理
mappedHandler = getHandler(processedRequest);

//HandlerMapping:处理器映射。/xxx->>xxxx



  1. 在doDispach()中有getHandler方法,他会找到我们此时调用需要找到的请求

  2. 在getHandler()方法中可以看到有个handerMappings 它会加载所有的请求(在应用启动的时候就会加载保存)

img

  1. 在HandlerMapping中保存的我们写的所有请求

img

  1. 在AbstractHandlerMethodMapping中有lookupHandlerMethod方法,在这个方法中我们才能匹配到所要找的请求

img