目录
4.1 @RequestParam注解:请求参数,用于指定参数名称
4.2 @RequestBody注解:请求体,用于将json数据封装成java类
4.3 @PathVariable注解:用于获取restful风格的请求参数
4.7 @ModelAttribute注解:用于在跳转请求方法之前,封装实体
4.8 @SessionAttributes注解:将请求数据存放到Sessioin
四、SpringMVC 中的常用注解
- @RequestParam注解:请求参数,用于指定参数名称
- @RequestBody注解:请求体,用于将json数据封装成java类
- @PathVariable注解:用于获取restful风格的请求参数
- @RequestHeader注解:获取请求头
- @CookieValue注解:获取Cookie的值
- @ModelAttribute注解:用于在跳转请求方法之前,封装实体
- @SessionAttributes注解:将请求数据存放到Sessioin
4.1 @RequestParam注解:请求参数,用于指定参数名称
作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
- value:请求参数中的名称。
- required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
- defaultValue:表示默认值,如果不传递值
4.1.1 anno.jsp
<h3>RequestParam入门案例@RequestParam</h3>
<a href="anno/testRequestParam?name=哈哈&age=22">name,age都有</a><br/>
<a href="anno/testRequestParam">无参数</a><br/>
<a href="anno/testRequestParam?name=嘻嘻">只有name,没有age</a><br/>
4.1.2 AnnoController.java
@RequestMapping(value = "/testRequestParam")
/**
* value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
defaultValue:表示默认值,如果不传递值
*/
public String testRequestParam(@RequestParam(value = "name",required = true) String username,@RequestParam(value = "age",defaultValue = "10") Integer age){
System.out.println("执行了 AnnoController 类中的 testRequestParam ... username:" + username + " age:" + age);
return "success";
}
4.2 @RequestBody注解:请求体,用于将json数据封装成java类
作用:
- @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的)(重点)
- 用于获取请求体内容。直接使用得到是key=value&key=value...结构的数据。 post请求没有问题,get请求方式不适用。
属性:
- required:是否必须有请求体。默认值是:true。
- 当取值为true时,get请求方式会报错。
- 如果取值为false,get请求得到是null。
4.2.1 anno.jsp
<h3>@RequestBody</h3>
post请求jsp代码: <br>
<!-- request body注解 -->
<form action="anno/testRequestBody" method="post">
用户名称:<input type="text" name="username" ><br/>
用户密码:<input type="password" name="password" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
get请求jsp代码: <br>
<a href="anno/testRequestBody?body=test">requestBody注解get请求</a>
4.2.2 Controller
@RequestMapping(value = "/testRequestBody")
/**
required:是否必须有请求体。默认值是:true。
当取值为true时,get请求方式会报错。
如果取值为false,get请求得到是null。
*/
public String testRequestBody(@RequestBody(required = false) String body){
System.out.println("执行了 AnnoController 类中的 testRequestBody ... body:" + body);
return "success";
}
4.3 @PathVariable注解:用于获取restful风格的请求参数
作用:
- 用于绑定url中的占位符。例如:请求url中 /delete/{id}/{name},这个{id},{name}就是url占位符。
- rest风格:/delete/3/zhangsan
- url支持占位符是spring3.0之后加入的。是springmvc支持restful风格URL的一个重要标志。
属性:
- value:用于指定url中占位符名称。
- required:是否必须提供占位符。
4.3.1 anno.jsp
<h3>@PathVariable注解</h3>
<!-- PathVariable注解 -->
<a href="anno/testPathVariable/zhangsan/22">pathVariable注解</a>
4.3.2 Controller
@RequestMapping(value = "/testPathVariable/{name}/{age}")
public String testPathVariable(@PathVariable(value = "name") String username,@PathVariable(value = "age",required = false) Integer age){
System.out.println("执行了 AnnoController 类中的 testPathVariable ... username:" + username + " age:" + age);
return "success";
}
4.4 REST风格URL
REST(英文:Representational State Transfer,简称REST,说的意思是:表现层状态转变,或者叫做 “表述性状态转移”)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。
它本身并没有什么实用性,其核心价值在于如何设计出符合REST风格的网络接口。
RESTFUL的优点:
它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
RESTFUL的特性:
资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的URI就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。
比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。
HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须 通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
4.4.1 anno.jsp
<h1>resfful风格:jsp中示例代码:</h1>
<!-- 保存 -->
<form action="anno/testPathVariable" method="POST">
用户名称:<input type="text" name="username"><br/>
<input type="submit" value="保存"></form>
<hr/>
<!-- 更新 -->
<form action="anno/testPathVariable" method="PUT">
用户名称:<input type="text" name="username"><br/>
<input type="submit" value="更新">
</form>
<hr/>
<!-- 删除 -->
<form action="anno/testPathVariable/1" method="DELETE">
<input type="submit" value="删除">
</form>
<hr/>
<!-- 查询一个 -->
<form action="anno/testPathVariable/1" method="GET">
<input type="submit" value="查询">
</form>
<hr/>
4.4.2 Controller
@RequestMapping(value = "/testPathVariable",method = RequestMethod.POST)
public String save(User user){
System.out.println("执行了 AnnoController 类中的 save ... user:" + user);
return "success";
}
@RequestMapping(value = "/testPathVariable",method = RequestMethod.PUT)
public String update(User user){
System.out.println("执行了 AnnoController 类中的 update ... user:" + user);
return "success";
}
@RequestMapping(value = "/testPathVariable/{id}",method = RequestMethod.DELETE)
public String delete(@PathVariable(value = "id") Integer id){
System.out.println("执行了 AnnoController 类中的 delete ... id:" + id);
return "success";
}
@RequestMapping(value = "/testPathVariable/{id}",method = RequestMethod.GET)
public String find(@PathVariable(value = "id") Integer id){
System.out.println("执行了 AnnoController 类中的 find ... id:" + id);
return "success";
}
4.5 @RequestHeader注解:获取请求头
作用:
用于获取请求消息头。
属性:
value:提供消息头名称
required:是否必须有此消息头
4.5.1 anno.jsp
<h3>测试@RequestHeader注解</h3>
<!-- RequestHeader注解 -->
<a href="anno/testRequestHeader">获取请求消息头</a>
4.5.2 Controller
@RequestMapping(value = "/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String requestHeader){
System.out.println("执行了 AnnoController 类中的 testRequestHeader ... requestHeader:" + requestHeader);
return "success";
}
4.6 @CookieValue注解:获取Cookie的值
作用:
用于把指定cookie名称的值传入控制器方法参数。
属性:
value:指定cookie的名称。
required:是否必须有此cookie。
4.6.1 anno.jsp
<h3>测试@CookieValue注解</h3>
<!-- CookieValue注解 -->
<a href="anno/testCookieValue">CookieValue注解</a>
4.6.2 Controller
@RequestMapping(value = "/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
System.out.println("执行了 AnnoController 类中的 testCookieValue ... cookieValue:" + cookieValue);
return "success";
}
4.7 @ModelAttribute注解:用于在跳转请求方法之前,封装实体
作用:
该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。
- 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
- 出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
4.7.1 anno.jsp
<h3>测试@ModelAttribute注解</h3>
需求: 修改用户信息,要求用户的日期不能修改 jsp的代码:
<!-- 修改用户信息 -->
<form action="anno/testModelAttribute" method="post">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
4.7.2 Controller
@ModelAttribute// 在执行的方法之前运行
public void showModel(User user){
user.setUsername("李四");
user.setAge(22);
user.setBirthday(new Date());
}
@RequestMapping(value = "/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("执行了 AnnoController 类中的 testModelAttribute ... user:" + user);
return "success";
}
4.8 @SessionAttributes注解:将请求数据存放到Sessioin
作用:
用于多次执行控制器方法间的参数共享。 放置到类的上面。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。
相当于将数据存放到Session中。
4.8.1 anno.jsp
<h3>测试@SessionAttributes注解</h3>
<!-- SessionAttribute注解的使用 -->
<a href="anno/sessionAttributePut">存入SessionAttribute</a> <hr/>
<a href="anno/sessionAttributeGet">取出SessionAttribute</a> <hr/>
<a href="anno/sessionAttributeClean">清除SessionAttribute</a>
4.8.2 Controller
@SessionAttributes(value = {"username","password"},types = {Integer.class})
public class AnnoController {
@RequestMapping(value = "/sessionAttributePut")
public String sessionAttributePut(Model model){
model.addAttribute("username","zhangsan");
model.addAttribute("password",123);
model.addAttribute("birthday",new Date());
System.out.println("执行了 AnnoController 类中的 sessionAttributePut ... model:" + model);
return "success";
}
@RequestMapping(value = "/sessionAttributeGet")
public String sessionAttributeGet(ModelMap model){
System.out.println("执行了 AnnoController 类中的 sessionAttributeGet ... model:" + model.get("username") + ", " + model.get("password") + ", " + model.get("birthday"));
return "success";
}
@RequestMapping(value = "/sessionAttributeClean")
public String sessionAttributeClean(SessionStatus sessionStatus){
System.out.println("执行了 AnnoController 类中的 sessionAttributeClean ... ");
sessionStatus.setComplete();
return "success";
}
}