SpringMVC 学习系列 (5) 之 数据绑定

在系列(4)中我们介绍了如何用@RequestParam来绑定数据,下面我们来看一下其它几个数据绑定注解的使用方法。

1.@PathVariable 用来绑定URL模板变量值,这个我们已经在系列(3)中介绍了使用方法,这里不在赘述。

2.@CookieValue 用来绑定Cookie中的数据。下面我们用获取Cookie中的sessionId做测试:

在DataBindController添加cookiebind action,代码如下:

复制代码

1//@CookieValue Test 2@RequestMapping(value="/cookiebind", method = {RequestMethod.GET}) 3public String cookieBind(HttpServletRequest request, Model model, @CookieValue(value="JSESSIONID", defaultValue="") String jsessionId){ 4 5 model.addAttribute("jsessionId", jsessionId); 6 return "cookiebindresult"; 7}

复制代码

在views文件夹中添加一个cookiebindresult.jsp视图,代码如下:

复制代码

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4<html> 5<head> 6<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7<title>Insert title here</title> 8</head> 9<body> 10 ${jsessionId} 11</body> 12</html>

复制代码

运行测试:

1

可以看到已经获取到了sessionId。

注:@CookieValue 与@RequestParam 一样也有3个参数,其含义与的@RequestParam 参数含义相同。

3.@RequestHeader 用来绑定请求头中的数据,我们用@RequestHeader获取User-Agent 来做演示:

在DataBindController添加requestheaderbind action,代码如下:

复制代码

1//@RequestHeader Test 2@RequestMapping(value="/requestheaderbind", method = {RequestMethod.GET}) 3public String requestHeaderBind(HttpServletRequest request, Model model, @RequestHeader(value="User-Agent", defaultValue="") String userAgent){ 4 5 model.addAttribute("userAgent", userAgent); 6 return "requestheaderbindresult"; 7}

复制代码

在views文件夹中添加一个requestheaderbindresult.jsp视图,代码如下:

复制代码

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4<html> 5<head> 6<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7<title>Insert title here</title> 8</head> 9<body> 10 ${userAgent} 11</body> 12</html>

复制代码

运行测试:

2

可以看到已经获取到了User-Agent 。

注:@RequestHeader 与@RequestParam 一样也有3个参数,其含义与的@RequestParam 参数含义相同。

4.@ModelAttribute 绑定数据到模型中。在系列(4)的modelAutoBind action中我们将表单提交的数据添加到Model中的代码如下:

1@RequestMapping(value="/modelautobind", method = {RequestMethod.POST}) 2public String modelAutoBind(HttpServletRequest request, Model model, AccountModel accountModel){ 3 4 model.addAttribute("accountmodel", accountModel); 5 return "modelautobindresult"; 6}

而借助于@ModelAttribute 我们可以更简单的讲数据添加到Model中,把上面的代码修改为:

1@RequestMapping(value="/modelautobind", method = {RequestMethod.POST}) 2public String modelAutoBind(HttpServletRequest request, @ModelAttribute("accountmodel") AccountModel accountModel){ 3 4 return "modelautobindresult"; 5}

运行测试:

3

可以看到依然成功的绑定了提交的数据。

5.Model中的数据作用域是Request级别的,也就是说在一个Request请求中是获取不到其它Request请求的Model的数据的。但我们可以用@SessionAttributes 把数据存储到session中,来保持多次请求间数据,这样就可以来实现比如分步骤提交表单等需求。下面我们来看如何分2步把数据绑定到AccountModel中:

在DataBindController上添加:

@SessionAttributes(value = "sessionaccountmodel")

在DataBindController添加usernamebind和passwordbind action,代码如下:

复制代码

1//@SessionAttributes Test 2@ModelAttribute("sessionaccountmodel") 3public AccountModel initAccountModel(){ 4 5 return new AccountModel(); 6} 7 8@RequestMapping(value="/usernamebind", method = {RequestMethod.GET}) 9public String userNameBind( Model model, AccountModel accountModel){ 10 11 model.addAttribute("sessionaccountmodel", new AccountModel()); 12 return "usernamebind"; 13} 14 15@RequestMapping(value="/usernamebind", method = {RequestMethod.POST}) 16public String userNameBindPost( @ModelAttribute("sessionaccountmodel") AccountModel accountModel){ 17 18 //重定向到密码绑定测试 19 return "redirect:passwordbind"; 20} 21 22@RequestMapping(value="/passwordbind", method = {RequestMethod.GET}) 23public String passwordBind(@ModelAttribute("sessionaccountmodel") AccountModel accountModel){ 24 25 return "passwordbind"; 26} 27 28@RequestMapping(value="/passwordbind", method = {RequestMethod.POST}) 29public String passwordBindPost(@ModelAttribute("sessionaccountmodel") AccountModel accountModel, SessionStatus status){ 30 31 //销毁@SessionAttributes存储的对象 32 status.setComplete(); 33 //显示绑定结果 34 return "sessionmodelbindresult"; 35}

复制代码

由于我们在controller上指定了@SessionAttributes,所以在@ModelAttribute(“xxx”)注解的参数会直接在@SessionAttributes中查找名为”xxx”的对象,如果没有找到则调用@ModelAttribute(“xxx”)注解的方法返回对象并存入@SessionAttributes(如果没有找到且没有@ModelAttribute(“xxx”)注解的方法就会抛出HttpSessionRequiredException)。当执行到最后一步就可以调用SessionStatus .setComplete()方法把@SessionAttributes中保存对象销毁了(不会清除HttpSession中的数据)。

在views文件夹中添加usernamebind.jsp、passwordbind.jsp和sessionmodelbindresult.jsp视图内容分别如下:

复制代码

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 5<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 6 7<html> 8<head> 9<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10<title>Insert title here</title> 11</head> 12<body> 13 <form:form modelAttribute="sessionaccountmodel" method="post"> 14 用户名:<form:input path="username"/><br/> 15 <input type="submit" value="Submit" /> 16 </form:form> 17</body> 18</html>

复制代码

复制代码

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 5<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 6 7<html> 8<head> 9<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10<title>Insert title here</title> 11</head> 12<body> 13 <form:form modelAttribute="sessionaccountmodel" method="post"> 14 密 码:<form:password path="password"/><br/> 15 <input type="submit" value="Submit" /> 16 </form:form> 17</body> 18</html>

复制代码

复制代码

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4<html> 5<head> 6<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7<title>Insert title here</title> 8</head> 9<body> 10 用户名:${sessionaccountmodel.username}<br/> 11 密 码:${sessionaccountmodel.password} 12</body> 13</html>

复制代码

运行测试:

4

5

6

可以看到我们已经成功的分2步把数据绑定到AccountModel中了。

注:

@SessionAttributes有value和types两个参数其中value指明要对象的名称,types指定要绑定对象的类型,如@SessionAttributes(value = "sessionaccountmodel", types=AccountModel.class)两者是and关系,需要同时满足。也可以同时指定多个value和types 如:@SessionAttributes(value = {"aa", "aa"} , types={XXX.class, YYY.class}) 。

6.@RequestBody 调用合适的MessageConvert来把非application/x-www-form-urlencoded请求中的内容转换为指定的对象它通常与@ResponseBody合用,@ResponseBody与.@RequestBody刚好相反,他把指定的对象转换为合适的内容(请求头为Accept:application/json 则返回json数据)并返回。这里我们用一个ajax请求做演示:

由于Spring默认解析json用的是Jackson,所以我们这里要把jackson-core-asl-1.9.13.jar和jackson-mapper-asl-1.9.13.jar两个包添加到我们项目。

修改AccountModel让其继承Serializable接口,并添加一个空的构造函数(为了Jackson做转换)。

在DataBindController添加requestBodyBindaction,代码如下:

复制代码

1//@RequestBody Test 2@RequestMapping(value="/requestbodybind", method = {RequestMethod.GET}) 3public String requestBodyBind(Model model){ 4 5 model.addAttribute("accountmodel", new AccountModel()); 6 return "requestbodybind"; 7} 8 9@RequestMapping(value="/requestbodybind", method = {RequestMethod.POST}) 10public @ResponseBody AccountModel requestBodyBind(@RequestBody AccountModel accountModel){ 11 12 return accountModel; 13}

复制代码

在views文件夹中添加requestbodybind.jsp视图内容如下:

复制代码

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 5<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 6 7<html> 8<head> 9 10<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 11 12<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 13<title>Insert title here</title> 14</head> 15<body> 16 <form:form modelAttribute="accountmodel" method="post"> 17 用户名:<form:input path="username"/><br/> 18 密 码:<form:password path="password"/><br/> 19 <input type="button" id="submit" value="Submit" /> 20 </form:form> 21 22 <script type="text/javascript"> 23 $(function() { 24 $("#submit").click(function() { 25 var postdata = '{"username":"' + $('#username').val() + '","password":"' + $('#password').val() + '"}'; 26 $.ajax({ 27 type : 'POST', 28 contentType : 'application/json', 29 url : 'http://localhost:8080/SpringMVCLesson/databind/requestbodybind', 30 processData : false, 31 dataType : 'json', 32 data : postdata, 33 success : function(data) { 34 alert('username : '+data.username+'\npassword : '+data.password); 35 }, 36 error : function() { 37 alert('error...'); 38 } 39 }); 40 }); 41 }); 42 </script> 43</body> 44</html>

复制代码

运行测试:

7

结果正确,证明转换成功。

7.@RequestPart 绑定“multipart/form-data“类型数据,支持javax.servlet.http.Part文件上传,并可可以进行类型转换,详见官方文档:

http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/htmlsingle/#new-in-3.1-mvc-requestpart

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

SpringMVC 学习系列 (5) 之 数据绑定 - HelloWorld