SpringMVC(五)数据绑定-2

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

[email protected] 用来绑定URL模板变量值,这个我们已经在SpringMVC(三)URL请求到Action的映射规则中介绍了使用方法,这里不在赘述。

[email protected] 用来绑定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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${jsessionId}
</body>
</html>

运行测试:

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

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

[email protected] 用来绑定请求头中的数据,我们用@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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${userAgent}
</body>
</html>

运行测试:

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

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

[email protected] 绑定数据到模型中。在系列(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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form:form modelAttribute="sessionaccountmodel" method="post">
        用户名:<form:input path="username"/><br/>
        <input type="submit" value="Submit" />
    </form:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form:form modelAttribute="sessionaccountmodel" method="post">
        密 码:<form:password path="password"/><br/>
        <input type="submit" value="Submit" />
    </form:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    用户名:${sessionaccountmodel.username}<br/>
    密 码:${sessionaccountmodel.password}
</body>
</html>

运行测试:

可以看到我们已经成功的分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}) 。

[email protected] 调用合适的MessageConvert来把非application/x-www-form-urlencoded请求中的内容转换为指定的对象它通常与@ResponseBody合用,@ResponseBody与[email protected]刚好相反,他把指定的对象转换为合适的内容(请求头为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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
<head>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form:form modelAttribute="accountmodel" method="post">
        用户名:<form:input path="username"/><br/>
        密 码:<form:password path="password"/><br/>
        <input type="button" id="submit" value="Submit" />
    </form:form> 

    <script type="text/javascript">
        $(function() {
            $("#submit").click(function() {
                var postdata = ‘{"username":"‘ + $(‘#username‘).val() + ‘","password":"‘ + $(‘#password‘).val() + ‘"}‘;
                $.ajax({
                    type : ‘POST‘,
                    contentType : ‘application/json‘,
                    url : ‘http://localhost:8080/SpringMVCLesson/databind/requestbodybind‘,
                    processData : false,
                    dataType : ‘json‘,
                    data : postdata,
                    success : function(data) {
                        alert(‘username : ‘+data.username+‘\npassword : ‘+data.password);
                    },
                    error : function() {
                        alert(‘error...‘);
                    }
                });
            });
        });
    </script>
</body>
</html>

运行测试:

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

[email protected] 绑定“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

时间: 2024-10-09 21:56:45

SpringMVC(五)数据绑定-2的相关文章

SpringMVC之数据绑定

SpringMVC之数据绑定 #数据绑定:Spring MVC会根据客户端请求参数的不同,将请求信息以一定的方式转换并绑定 到控制器类中的方法参数上. #说明:这里的"以一定的方式"应该指的是什么?过段时间买个比较厚的书看看. #原理概括:Spring MVC将ServletRequest对象传递给DataBinder(数据绑定组件),将控制 器的入参传给DataBinder(数据绑定组件),DataBinder(数据绑定组件)调用 ConversionService组件进行数据类型转

SpringMVC(五) RequestMapping 请求参数和请求头

可以通过在@RequestMapping的params参数中设置可以传入的参数,且支持简单的表达式,如以下格式: @RequestMapping(value="helloRWorld",params={"name","age!=10"}) 参考的控制器代码如下: package com.tiekui.springmvc.handlers; import org.springframework.stereotype.Controller; impo

Asp.Net北大青鸟总结(五)-数据绑定控件

在前面的博客我已经介绍了关于一个特殊控件也是我们经常用到的控件gridview的使用实现真假分页.这也是属于绑定控件的一种使用,那么我们接下来来介绍一下数据绑定这门技术吧!  一.数据绑定的概念 数据绑定是一项非常简单.有效的技术.asp.net采用数据绑定技术将显示控件的摸个属相与数据源绑定在一起.当数据源中的数据发生变化且重新请求网页时,被绑定对象中的属性将随数据源而改变. 二.数据绑定的应用范围 数据绑定的应用范围非常广泛,数据集.数组.集合.XML文档,甚至一般的变量,都可以作为数据源,

springmvc(五)----异常处理

总结 注意: 由@SessionAttributes引发的异常 原因: 在implicitModel中查找key对应的对象,若存在,则作为入参传入,不存在就看有无@SessionAttritubes修饰,用了该注解,如果@SessionAttritubes注解的value中包含了key,就讲该对象传入形参,可是有可能虽然注解了,但是session中还没有该对象,则会报异常. 解决方案: 加一个@ModelSttribute修饰的方法 1 @ModelAttribute 2 public void

SpringMvc 数据绑定400错误

今天请求一个SpringMvc 的时候,客户端总是报出: The request sent by the client was syntactically incorrect 网上都是说的是bean的名字和表单的名字不一样,但是我检查了N多遍之后,还是有报这个异常,就想到了SpringMvc 自动装配的问题. 然后看日志说是""转为int类型的时候不可以为空: 应该就是数据绑定的问题了,经过一番研究,springMvc的数据绑定有几种方式: 1,controller 独享 2,全局共享

【SSH系列】深入浅出SpringMvc+入门Demo

Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC和Struts.Struts2非常类似.Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler.通过可配置的handler mappings.view resolution.locale以及theme resolution来处理请求并且

springMVC能做什么,做j2ee时候要考虑什么

转载: http://jinnianshilongnian.iteye.com/category/231099 [置顶] 跟我学SpringMVC目录汇总贴.PDF下载.源码下载 博客分类: 跟开涛学SpringMVC 电子书下载链接 请登录后下载   在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 2012-12-22 08:05 浏览 188903 评论(91) 收藏 分类:企业架构 源代码下载——第七章 注解式控制器

angular架构预览(模块,组件.数据绑定等)

概念来自Angular官网 Angular 是一个用 HTML 和 JavaScript 或者一个可以编译成 JavaScript 的语言(例如 Dart 或者 TypeScript ),来构建客户端应用的框架. 写Angualr应用的步骤 a.用 Angular 扩展语法编写 HTML 模板              template b. 用组件类管理这些模板                                    component c.用服务添加应用逻辑          

深入学习SpringMVC

1.什么是SpringMVC? SpringMVC是Spring框架内置的MVC的实现.SpringMVC就是一个Spring内置的MVC框架.MVC框架,它解决WEB开发中常见的问题(参数接收.文件上传.表单验证.国际化等等),而且使用简单,与Spring无缝集成. 支持 RESTful风格的 URL 请求 .采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性. 2.SpringMVC底层实现 在没有使用SpringMVC之前我们都是使用的Servlet在做Web开发.但是使

SpringMVC的数据转换&amp;&amp;数据格式化&amp;&amp;数据校验

1 SpringMVC的数据绑定流程 SpringMVC将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. DataBinder调用装配在SpringMVC上下文中ConversionService组件进行数据类型转换.数据格式化工作.将Servlet中的请求信息填充到入参对象中. 调用Validator组件对已经绑定了请求信息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象