@RequestMapping详细用法以及部分原理

本文深入探讨了SpringMVC框架中@RequestMapping注解的高级用法,包括如何映射URL到控制器类或方法,处理请求参数、请求头、路径变量等,以及SpringMVC对请求参数的自动绑定机制。

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

@RequestMapping

大学生一枚,本章代码部分借鉴与官方文档以及尚硅谷Spring教学篇,侵删

1.@RequestMapping将map 映射到整个 class 或特定的处理程序方法

@RequestMapping 注解为控制器指定可 以处理哪些 URL 请求

  • 类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
  • 方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若 类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录

@RequestMapping支持Ant 风格资源地址 3 种匹配符:

  • ?:匹配文件名中的一个字符
  • *:匹配文件名中的任意字符
  • 匹配多层路径

2.1 设定映射请求参数与请求头:

您可以通过请求参数条件params或headers来缩小请求匹配

eg:只匹配URL为testParamsAndHeaders的超链接,并且带有username 与 age 的参数 并且age不等于10
,加上http请求中"Accept-Language=en-US,zh;q=0.8的请求。
如果不满足,则404

@RequestMapping(
	value = "testParamsAndHeaders", 
	params = { "username","age!=10" }, 
	headers = { "Accept-Language=en-US,zh;q=0.8" }
){
//......
}

2.2 指定请求方法:

@RequestMapping 可以使用method = RequestMethod 来指定请求的方式 有:GET POST DELETE PUT

@RequestMapping("/appointments")
public class AppointmentsController {
@RequestMapping(method = RequestMethod.GET/POST/DELETE/PUT)
         public Map<String, Appointment> get() {
         return appointmentBook.getAppointmentsForToday();
     }
}

Spring Framework 4.3 引入了以下 method-level 组成的@RequestMapping annotation 变体,它们有助于简化 common HTTP 方法的映射,更好地表达带注释的处理程序方法的语义。例

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
 @GetMapping("/{day}")
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model){
    return appointmentBook.getAppointmentsForDay(day);
}

2.3@PathVariable映射URL绑定占位符

(有了@PathVariable使得Spinrg MVC 更加靠近了REST风格的URL)

在 Spring MVC 中,可以在方法参数上使用@PathVariable annotation 将其绑定到 URI 模板变量的 value:
@PathVariable参数可以是任何简单类型,例如int,long,Date等.Spring 会自动转换为适当的类型

可以获取到方法{xxx}的属性

@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable String ownerId, Model model) {
    Owner owner = ownerService.findOwner(ownerId);
    model.addAttribute("owner", owner);
    return "displayOwner";
}

也可以获取到类上有{xxx}的属性

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
    @RequestMapping("/pets/{petId}")
    public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
    //.......
    }
}

2.4 使用 @RequestParam 绑定请求参数值:

使用@RequestParam 将请求参数绑定到控制器中的方法参数。
默认情况下,使用此 annotation 的参数是必需的,但您可以通过将@RequestParam的required属性设置为false,eg

@RequestMapping(value = "/testRequestParam")
public String testRequestParam(
		@RequestParam(value = "username") String un,
		@RequestParam(value = "age", required = false, defaultValue = "0") int age
	) {
	System.out.println("testRequestParam, username: " + un + ", age: "+ age);
	return SUCCESS;
}

2.5 使用 @RequestHeader 绑定请求报头的属性值

请求头包含了若干个属性,服务器可据此获知客户端的信 息,通过 @RequestHeader 即可将http请求头中的属性值绑 定到处理方法的入参中

@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept-Language") String al) {
	System.out.println("testRequestHeader, Accept-Language: " + al);
	return SUCCESS;
}

2.6 使用 @CookieValue 绑定请求中的 Cookie 值

@CookieValue 允许将方法参数绑定到 HTTP cookie 的 value。

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie) {
//....
}

2.7@RequestMapping 可以接受的参数

可以Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。支持级联属性。

前端数据如下:

<form action="springmvc/testPojo" method="post">
		<!-- id: <input type="text" name="id"/>
		<br> -->
		username: <input type="text" name="username"/>
		<br>
		password: <input type="password" name="password"/>
		<br>
		email: <input type="text" name="email"/>
		<br>
		age: <input type="text" name="age"/>
		<br>
		city: <input type="text" name="address.city"/>
		<br>
		province: <input type="text" name="address.province"/>
		<br>
		<input type="submit" value="Submit"/>
	</form>

后台java代码如下

public String testPojo(User user) {
	//.................
}

也可以 可以使用 Serlvet 原生的 API 作为目标方法的参数 具体支持以下类型

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader Writer
public void testServletAPI(
	HttpServletRequest request,HttpServletResponse response, Writer out
) throws IOException {
	//......
}

可以在Sping源码 AnnotationMethodHandlerAdapter类中resolveStandardArgument()找到答案
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值