RequestMapping注解

本文详细介绍了SpringMVC中@RequestMapping注解的使用,包括其功能、位置、value属性、method属性以及路径中的占位符。@RequestMapping用于建立请求和控制器方法的映射关系,value属性用于指定请求路径,method属性指定请求方式。同时,文章通过示例展示了如何处理多个请求路径和请求方式,以及SpringMVC支持的RESTful风格路径中的占位符和@PathVariable的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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来进行修饰。  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GodAiro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值