当前位置:   article > 正文

Springboot之请求映射_springboot 映射 全部请求

springboot 映射 全部请求

@GetMapping、@PostMapping、@PutMapping等:他们相当于RequestMapping(value = “/xxx” , method = RequestMethod.GET)或 RequestMapping(value = “/xxx” , method = RequestMethod.POST),即限定请求方法的简写。

请求映射原理

什么是请求映射?
个人理解:首先在浏览器搜索一个URL会向程序发送请求,程序会对其进行处理,找到对应的页面。或 当提交表单时也会对程序发送post或get请求。

  • 来看看请求在Springboot中是怎么被处理的:
  • SpringMVC功能分析都从 org.springframework.web.servlet.DispatcherServlet-》doDispatch() (即最终由doDispatch函数处理)
    在这里插入图片描述
    在SpringBoot中,所有的请求都是会来到DispatcherServlet中,从此图可以看出继承树,是来到HttpServlet的,反正最终可以找到doDispatch方法。
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
               // HandlerMapping意思是处理器映射,把一个URL指定到一个Controller上 HandlerMapping的作用就是解析请求链接,然后根据请求链接找到执行这个请求的类(HandlerMapping所说的handler,也就是我们写的Controller或是Action)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

从上面的代码可以看到,最终将会通过getHandler方法,找到合适的Handler(Controller方法)处理。就是看request有无对应的@RequestMapping相对应,有的话就返回这个@RequestMapping绑定的方法(handle)。如下图
在这里插入图片描述
从下图可以看到handlerMapping中会有五个值:
在这里插入图片描述
其中排在第一的RequestMappingHandlerMapping:保存了所有Controller中的@RequestMapping 和handler的映射规则。从下图中可以看到左边的是@RequestMapping , 右边是其在Controller绑定的对应的方法,即handel

在这里插入图片描述
所有的请求映射都在HandlerMapping中。

  • SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 。访问 /能访问到index.html;
  • SpringBoot自动配置了默认 的 RequestMappingHandlerMapping

首先, 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。如果有就找到这个请求对应的handler。如果没有就是下一个 HandlerMapping。

欢迎页的原理:
你啥也没传,也就是"/",那么在RequestMappingHandlerMapping中将不会找到合适的,然后他就会循环到下一个控制器WelcomePageHandlerMapping。而这个控制器就是专门处理"/"的,于是根据处理,转发到index.html中。

rest使用与原理

  • 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户
  • 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户。

想要使用rest风格,需要在配置文件中手动开启(似乎新版本默认开启了)

mvc:
     hiddenmethod:
		filter:
			enabled: true
  • 1
  • 2
  • 3
  • 4

核心Filter;HiddenHttpMethodFilter

  • 用法: 表单method=post,隐藏域 _method=put
    表单只有get和post,使用rest风格,将put和delete请求作为post请求的隐藏请求。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1> 你好!!!!</h1>

<form action="/user" method="get">
    <input value="Rest_GET提交" type="submit"/>
</form>

<form action="/user" method="post">
    <input value="Rest_POST提交" type="submit"/>
</form>

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

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

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
package com.atguigu.boot.ccontroller;

import org.springframework.web.bind.annotation.*;

/**
 * @author Juneluo
 * @create 2021-08-15 20:52
 */

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

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

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

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


}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/718842
推荐阅读
相关标签
  

闽ICP备14008679号