博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC学习(5):数据绑定2 @PathVariable、@CookieValue、@RequestHeader、@ModelAttribute.....
阅读量:6424 次
发布时间:2019-06-23

本文共 6305 字,大约阅读时间需要 21 分钟。

  hot3.png

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

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

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

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

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

 

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

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here ${jsessionId}

 

运行测试:

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

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

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

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

 

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

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

 

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here ${userAgent}

 

运行测试:

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

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

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

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

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

 

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

 

运行测试:

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

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

在DataBindController上添加:

@SessionAttributes(value = "sessionaccountmodel")

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

 

//@SessionAttributes Test@ModelAttribute("sessionaccountmodel")public AccountModel initAccountModel(){        return new AccountModel();}@RequestMapping(value="/usernamebind", method = {RequestMethod.GET})public String userNameBind( Model model, AccountModel accountModel){        model.addAttribute("sessionaccountmodel", new AccountModel());    return "usernamebind";}@RequestMapping(value="/usernamebind", method = {RequestMethod.POST})public String userNameBindPost( @ModelAttribute("sessionaccountmodel") AccountModel accountModel){        //重定向到密码绑定测试    return "redirect:passwordbind";}@RequestMapping(value="/passwordbind", method = {RequestMethod.GET})public String passwordBind(@ModelAttribute("sessionaccountmodel") AccountModel accountModel){        return "passwordbind";}@RequestMapping(value="/passwordbind", method = {RequestMethod.POST})public String passwordBindPost(@ModelAttribute("sessionaccountmodel") AccountModel accountModel, SessionStatus status){        //销毁@SessionAttributes存储的对象    status.setComplete();    //显示绑定结果    return "sessionmodelbindresult";}

 

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

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

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
Insert title here
用户名:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
Insert title here
密 码:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
Insert title here 用户名:${sessionaccountmodel.username}
密 码:${sessionaccountmodel.password}

 

运行测试:

可以看到我们已经成功的分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,代码如下:

//@RequestBody Test@RequestMapping(value="/requestbodybind", method = {RequestMethod.GET})public String requestBodyBind(Model model){        model.addAttribute("accountmodel", new AccountModel());    return "requestbodybind";}@RequestMapping(value="/requestbodybind", method = {RequestMethod.POST})public @ResponseBody AccountModel requestBodyBind(@RequestBody AccountModel accountModel){                return accountModel;}

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

 

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
Insert title here
用户名:
密 码:

 

运行测试:

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

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

 

代码下载:

 

转载于:https://my.oschina.net/itommy/blog/845386

你可能感兴趣的文章
学习使用Bing Maps Silverlight Control(一):准备和新建
查看>>
讲一讲什么叫阻塞非阻塞同步异步
查看>>
选择器补遗
查看>>
C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument
查看>>
轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
dreamweaver中的 map怎么调用?_制作热点图像区域
查看>>
代码19
查看>>
Win10系列:UWP界面布局进阶5
查看>>
ABP Zero 本地化语言的初始化和扩展
查看>>
转Hibernate 一对多关联的CRUD__@ManyToOne(cascade=(CascadeType.ALL))
查看>>
FCT需求分析
查看>>
开门人和关门人(杭电1234)
查看>>
万能adapter
查看>>
开发指南专题六:JEECG微云高速开发平台代码生成
查看>>
cocos2d-x 游戏优化方案
查看>>
1.3 Quick Start中 Step 6: Setting up a multi-broker cluster官网剖析(博主推荐)
查看>>
remote desktop connection manager
查看>>
开源库RxJava、ButterKnife
查看>>
JDK内置工具jstack(Java Stack Trace)(转)
查看>>
百度之星 / 初赛第二场 B题
查看>>