和大家一起讲解 Spring MVC 是如何使用下面的几个注解解析请求包中的数据。
- @RequestParam ;
- @CookieValue;
- @RequestHeader;
- @PathVariable 。
重点就是你要记住它们的使用场景。
Spring MVC 提供了很多实用的注解,用来解析请求包、自动绑定请求包中不同位置的数据。在使用注解解析请求包中的数据前,先了解一下请求包的格式。
WEB 应用程序中, 所谓的请求包是指遵循 HTTP 协议的一种数据格式包。在某些文章中,称请求包为报文。
一个完整的请求包应该由 3 个部分组成:
- 请求行: 包括请求方法、请求的资源地址(URL) 、HTTP 协议版本号;
- 消息头: 消息头是传送给服务器的信息,以 key:value 的格式描述;
- 实体部分或报文体: 以 key=value 的数据格式保存客户端传递给应用程序的数据。
@RequestParam
功能: 自动绑定请求包中的请求参数中的值。
请求参数可以出现在请求包中的 2 个位置:
- 用 ? 的方式附加在 URL 后面。如 http://localhost:8888/saveUser?name=abc 。name 就是请求参数,abc 是值;
- 以类似于 name=abc 的方式存储在请求包的报文体中(实体部分)。
Tips: 当客户端以 POST 方法请求时,数据将存储在实体部分。
@RequestMapping(value="/saveUser")
public String save(@RequestParam("userName") String userName,@RequestParam("password") password){}
@CookieValue
功能描述: @CookieValue 用来自动绑定请求包中的 Cookie 值。
Cookie 一般由 WEB 应用程序在服务器端创建,通过响应包传递给浏览器,并可以在浏览器端以文件的形式存储。在后续请求过程中,请求包又可以携带此 Cookie 返回给服务器。
Cookie 所能保存的数据量有限且只能是字符类型,但其应用场景较多,如 WEB 程序中的 Session 组件的状态维护、用户免输入登录、历史记录显示等功能都可以通过 Cookie 实现。
如果要获取请求包中的 Cookie 中的值,控制器中只需要如下编码便可:
@RequestMapping(value="/sessionId")
public String getSessionId(@CookieValue("JSESSIONID") String sessionId){
}
当请求格式类似于 http://localhost:8888/saveUser?sessionId 时,getSessionId()方法中的 sessionId 参数会被注入 Cookie 中所携带的 JSESSIONID 的值。
只要指定 Cookie 的名称,@CookieValue 便能自动获取此 Cookie 的值。
@PathVariable
功能描述: @PathVariable 注解用来获取 URL 中变量的值。
什么是 URL 中的变量?还是用一个实例来说话:
@RequestMapping("/user/{userId}")
public String getUserById(@PathVariable("userId") String userId){
}
{userId} 就是变量占位符。具体请求时,可使用一个真实值替换。如请求格式:http://localhost:8888/user/1 时,@PathVariable 可以为 getUserById() 方法中的 userId 参数注入值 1。
@PathVariable 注解同样有一个 required 属性,表示是否强制 URL 中有变量的存在。
boolean required() default true;
@PathVariable 注解非常有用,请你一定要记住它。
这 4 个注解的使用方式大同小异,每一种注解各自关注了请求包中不同位置的数据:
- @RequestParam :关注请求参数中的值;
- @CookieValue:关注 Cookie 的值;
- @RequestHeader 关注请求头的值;
- @PathVariable :关注请求变量的值。