Spring MVC 框架的目的是为了解放开发者,让开发者更专注于核心逻辑,它提供了很多辅助性功能模块,来提高开发者的开发效率。
本节课将和大家一起讲解 Spring MVC 是如何使用下面的几个注解解析请求包中的数据。
本章节的重点就是你要记住它们的使用场景。
原生 Servlet 开发过程中,开发者定义的 Servlet 具有请求响应功能。因为 J2EE 中的 Servlet 仅仅只是提供了编写企业级应用程序的规范,并没有提供更多实质性的功能。在执行响应逻辑之前或之后需要开发者编写一些通用的功能代码。
如解析请求包中的数据、构建响应路径……
Spring MVC 提供了很多实用的注解,用来解析请求包、自动绑定请求包中不同位置的数据。在使用注解解析请求包中的数据前,先了解一下请求包的格式。
WEB 应用程序中, 所谓的请求包是指遵循 HTTP 协议的一种数据格式包。在某些文章中,称请求包为报文。
一个完整的请求包应该由 3 个部分组成:
功能: 自动绑定请求包中的请求参数中的值。
请求参数可以出现在请求包中的 2 个位置:
Tips: 当客户端以 POST 方法请求时,数据将存储在实体部分。
实例:
@RequestMapping(value="/saveUser")
public String save(@RequestParam("userName") String userName,@RequestParam("password") password){}
当请求格式类似于 http://localhost:8888/saveUser?userName=abc&password=123456 时,save()方法中的 userName 和 password 2 个参数会被分别注入 abc 和 123456 这 2 个值。
客户端在表单中以 POST 方法发送请求时,数据将会以 userName=abc&password=123456 的格式存放在请求包的实体部分,也会自动注入到 save() 方法的参数中。
Tips: 一定要保证 @RequestParam(“参数名”) 中的 “参数名” 和请求包中的参数名的命名相同。
@RequestParam 注解中有 3 个常用的属性:
@AliasFor("name")
String value() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
综合实例:
@RequestMapping(value="/saveUser")
public String save(@RequestParam(value = "userName",defaultValue="mk",required = false) String userName,){
}
Tips: 当不能确定是否存在名为 “userName” 的参数时,可使用 defaultValue 提供默认值,并设置 required 为 false。
功能描述: @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 的值。
功能描述: 请求包中有很多消息头信息,都是以 key:value 的格式存在。在开发过程中,当需要获取这些消息头信息时,可以使用 @RequestHeader 注解自动绑定。
实例:
@RequestMapping(value="/header")
public String getHeader(@RequestHeader("Accept-Language") String accpetLanguage){
...
}
当请求格式类似于 http://localhost:8888/header 时,**getHeader()**方法的 accpetLanguage 参数会被注入请求包中 key 名为 Accept-Language 的消息头值。
当然,你可以更改成你所需要的消息头的 key 名,然后获取其对应的值。
@RequestHeader 注解中的方法如下:
@AliasFor("name")
String value() default "";
String name() default "";
boolean required() default true;
String defaultValue() default ValueConstants.DEFAULT_NONE;
其功能和 @RequestMapping 注解中的一样。两者只是关心的请求包中的数据不同而已。
功能描述: @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 个注解,大家可以使用它们很轻松的从请求包中解析自己所需要的数据。
这 4 个注解的使用方式大同小异,每一种注解各自关注了请求包中不同位置的数据:
0/1000