• RequestMapping注解


    目录

    1. @RequestMapping注解的功能

    2. @RequestMapping注解的位置

    3. @RequestMapping注解的value属性

    4. @RequestMapping注解的method属性

    5.SpringMVC支持路径中的占位符(重点)


    1. @RequestMapping注解的功能

    从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。

    SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。

    2. @RequestMapping注解的位置

    首页index.html有了,我们就要去控制器写一个控制器方法,访问首页,请求路径就是"/",返回一个String。

    当我们的浏览器发送请求到服务器,DispatcherServlet来接收到请求,就会将请求地址和控制器方法所使用的注解@RequestMapping()的value属性值进行匹配,如果能匹配成功,那么这个方法就是处理请求的方法,而在这个方法里返回的字符串是视图名称,这个可以由视图解析器解析,加上视图前缀和后缀找到相对应的页面,然后通过thymeleaf解析之后,响应到浏览器。

    1. @RequestMapping("/")
    2. public String index(){
    3. return "index";
    4. }

    浏览器所解析的路径少了上下文路径,用thymeleaf里的@{/testRequestMapping}所包括的路径,会自动添加上下文路径。

    <a th:href="@{/testRequestMapping}">测试RequestMapping注解的位置a><br>

    此时去跳转是没有问题的


    但是此时我们在类上面也去添加一个@RequestMapping,会发生什么?

    此时报了404错误,因为在类上面加了个@RequestMapping注解:

    @RequestMapping标识一个类:设置映射请求的请求路径的初始信息

    @RequestMapping标识一个方法:设置映射请求请求路径的具体信息

    既然有初始信息和具体信息,那么类上有注解,类的方法上也有注解,那我们就需要先访问初始信息,才能访问具体信息,此时请求路径就变为:

    这里说明一下为什么要在类上面添加一个RequestMapping

    举个例子:当有用户模块和订单模块都是list的时候,我们的控制器@RequestMapping重名了,此时只能换个名字,但是只有这个名字可以更好的表示我们整个方法的意思,此时只需要在类上面加个RequestMapping用来表示一个类,下面的方法就不会与其他控制器发生命名冲突。


    3. @RequestMapping注解的value属性

    @RequestMapping注解的value属性通过请求的请求地址匹配请求映射

    @RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求

    @RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射


    那么我们用Ctrl+鼠标左键点击@RequestMapping这个注解,进去看一看,按ALT+7查看类中的所有方法列表

    可以看到value()是个数组,那么也就是说我们在顶上配置value注解的时候可以设置一个数组

    1. @Controller
    2. public class RequestMappingController {
    3. @RequestMapping({"/testRequestMapping","/test"})
    4. public String success(){
    5. return "success";
    6. }
    7. }
    1. <a th:href="@{/testRequestMapping}">测试RequestMapping注解的value属性-->/testRequestMappinga><br>
    2. <a th:href="@{/test}">测试RequestMapping注解的位置-->/testa><br>

    此时"/testRequestMapping","/test"这两个都可以跳转到success页面,也就是说前端发送过来的请求,只要是这两个中的其中一个就可以跳转到响应的页面

    也就是说,这里所表示的不是一个请求有2个地址,而是说当前的RequestMapping能够匹配的地址可以有多个,只要满足数组中的任意一个,就可以被当前请求映射所处理。

    4. @RequestMapping注解的method属性

    在之前的学习中,method属性在表单提交的时候有出现过,就是请求方式。

    @RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射。

    @RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求。


    我们在之前的前端页面中修改一下

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <h1>首页h1>
    9. <a th:href="@{/hello/testRequestMapping}">测试RequestMapping注解的位置a><br>
    10. <a th:href="@{/testRequestMapping}">测试RequestMapping注解的value属性-->/testRequestMappinga><br>
    11. <a th:href="@{/test}">测试RequestMapping注解的value属性-->/testa><br>
    12. <a th:href="@{/test}">测试RequestMapping注解的method属性-->/GETa><br>
    13. <form th:action="@{/test}" method="post">
    14. <input type="submit" value="测试RequestMapping注解的mathod属性-->POST">
    15. form>
    16. body>
    17. html>

    此时Controller中没有配置是POST请求还是GET请求,这时候去访问,会发现这两个请求都可以。


    当我们去@RequestMapping中的注解写method这个属性,这也是一个数组形式,请求的请求方式满足请求映射的method属性,就可以。

    1. @Controller
    2. public class RequestMappingController {
    3. @RequestMapping(
    4. value={"/testRequestMapping","/test"},
    5. method={RequestMethod.GET}
    6. )
    7. public String success(){
    8. return "success";
    9. }
    10. }

    此时将method换成GET请求,去点击POST的请求方式,那么会报405错误。

    如果想让请求映射支持POST请求和GET请求,那么就可以这样写。

    注:

    1、对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解

    处理get请求的映射-->@GetMapping

    处理post请求的映射-->@PostMapping

    处理put请求的映射-->@PutMapping

    处理delete请求的映射-->@DeleteMapping

    2、常用的请求方式有get,post,put,delete

    但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符串(put或delete),则按照默认的请求方式get处理,若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter,在RESTful部分会讲到

    5.SpringMVC支持路径中的占位符(重点)

    原始方式:/deleteUser?id=1

    rest方式:/deleteUser/1

    SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,再通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。

    <a th:href="@{/testRest/1/admin}">测试路径中的占位符-->/testResta><br>
    1. @RequestMapping("/testRest/{id}/{username}")
    2. public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
    3. System.out.println("id:"+id+",username:"+username);
    4. return "success";
    5. }
    6. //最终输出的内容为-->id:1,username:admin

    也就是说,这种问号携带参数的风格,被替换为另一种风格,特别是在后期的RESTful里面,这种风格是很常见的,只要前端传过来值,在Controller中的@RequestMapping注解里都用/{xxx}/{xxx}这种方式,并且参数还要用@PathVariable来进行修饰。  

  • 相关阅读:
    03【保姆级】-GO语言变量和数据类型和相互转换
    Linux下安装和使用MySQL的详细教程
    基于ssm列车票务信息管理系统获取(java毕业设计)
    【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列)
    计算机图形学入门28:相机、透镜和光场
    表白墙服务器版【交互接口、服务器端代码、前端代码、数据存入文件/数据库】
    SpringBoot简单整理
    随手记录: 扩展M.2硬盘,从1T换到2T 硬盘clone ubuntu设置等注意事项
    实际工作项目中搭配git托管代码的流程
    前后端分离springBoot项目集成部署vue
  • 原文地址:https://blog.csdn.net/qq_44706176/article/details/126681095