当前位置: 首页 > news >正文

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解析之后,响应到浏览器。

@RequestMapping("/")
public String index(){
	return "index";
}

浏览器所解析的路径少了上下文路径,用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注解的时候可以设置一个数组

@Controller
public class RequestMappingController {
	@RequestMapping({"/testRequestMapping","/test"})
	public String success(){
		return "success";
	}	
}
<a th:href="@{/testRequestMapping}">测试RequestMapping注解的value属性-->/testRequestMapping</a><br>
<a th:href="@{/test}">测试RequestMapping注解的位置-->/test</a><br>

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

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

4. @RequestMapping注解的method属性

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

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

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


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

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
      <meta charset="UTF-8">
      <title>Title</title>
</head>
<body>
      <h1>首页</h1>
      <a th:href="@{/hello/testRequestMapping}">测试RequestMapping注解的位置</a><br>
      <a th:href="@{/testRequestMapping}">测试RequestMapping注解的value属性-->/testRequestMapping</a><br>
      <a th:href="@{/test}">测试RequestMapping注解的value属性-->/test</a><br>
      <a th:href="@{/test}">测试RequestMapping注解的method属性-->/GET</a><br>
      <form th:action="@{/test}" method="post">
            <input type="submit" value="测试RequestMapping注解的mathod属性-->POST">
      </form>
</body>
</html>

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


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

@Controller
public class RequestMappingController {
	@RequestMapping(
			value={"/testRequestMapping","/test"},
			method={RequestMethod.GET}
			)
	public String success(){
		return "success";
	}
}

此时将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}">测试路径中的占位符-->/testRest</a><br>
@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
    System.out.println("id:"+id+",username:"+username);
    return "success";
}
//最终输出的内容为-->id:1,username:admin

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

相关文章:

  • 实战Spring Boot集成quartz任务调度框架
  • 神经网络深度学习(五)初始化
  • jvm虚拟机学习一class文件
  • 【编程题】【Scratch四级】2021.12 森林运动会
  • chapter 01 字符串的那些事
  • 给Python漫画分集标题下载工具开发Qt界面
  • 电子学会2022年6月青少年软件编程(图形化)等级考试试卷(二级)答案解析
  • 【Redis实战】生产中使用Redis的一些注意事项
  • 线性代数学习笔记8-3:二次型、合同矩阵、标准型、规范型
  • 06-vue-routers.js的基本使用,路由从定向,router-link代替a标签及样式,路由嵌套,路由动画
  • 【OpenCV】Chapter9.边缘检测与图像分割
  • 5. C# :单选框RadioButton、标签Label、列表框ListBox
  • vmware ubuntu 操作
  • 《linux程序设计》第二章笔记
  • 1. 数据结构基础知识
  • Effective Java 笔记(一)
  • Github访问慢解决办法
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Linux各目录及每个目录的详细介绍
  • node 版本过低
  • oschina
  • Spring Cloud Feign的两种使用姿势
  • vue2.0项目引入element-ui
  • 搭建gitbook 和 访问权限认证
  • 微信小程序开发问题汇总
  • 小程序开发之路(一)
  • 小试R空间处理新库sf
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 译有关态射的一切
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ![CDATA[ ]] 是什么东东
  • (ZT)出版业改革:该死的死,该生的生
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (六)激光线扫描-三维重建
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转) 深度模型优化性能 调参
  • (转)JAVA中的堆栈
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bashrc在哪里,alias妙用
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core 中的路径问题
  • .Net IE10 _doPostBack 未定义
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • ??在JSP中,java和JavaScript如何交互?
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @JoinTable会自动删除关联表的数据
  • @selector(..)警告提示
  • [20170728]oracle保留字.txt
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项