转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6831344.html 

参考:http://www.cnblogs.com/HD/p/4107674.html

一:数据绑定

1:基本类型的绑定

根据URL映射到某个处理函数时,函数的参数值自动在request中寻找同名的传过来的页面参数值。如果没有则报错,可以使用@RequestParam注解来修饰该函数参数,设置defaultValue,防止传过来空值时报错。

Controller代码:

@RequestMapping("saysth.do")
public void test(int count) {//参数名为count
}

表单代码:

<form action="saysth.do" method="post">
<input name="count" value="10" type="text"/>//标签参数名为count
......
</form>

2:基本类型的包装类型的绑定

根据URL映射到某个处理函数时,函数的参数值自动在request中寻找同名的传过来的页面参数值。允许参数值为空。

Controller代码:

@RequestMapping("saysth.do")
public void test(Integer count) {//参数名为count
}

表单代码:

<form action="saysth.do" method="post">
<input name="count" value="10" type="text"/>//标签参数名为count
......
</form>

3:数组类型绑定

根据URL映射到某个处理函数时,函数参数为一个数组,则自动在request寻找名字同数组名的参数的值们并存入数组。

如:url?name=111&name=222&name=333;则函数参数中的数组int[] arr的值为{111,222,333}

4:简单对象的绑定

根据URL映射到某个处理函数时,函数参数为一个简单的bean(即:类的属性全为简单数据类型的,并且定义了属性的setter和getter方法)。

则自动从request的参数中寻找与bean类属性同名的参数值赋给bean实例的同名属性,构造出一个bean实例作为函数参数传进函数中使用。

Model代码:

public class User {
private String firstName;
private String lastName; public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} }

Controller代码:

@RequestMapping("saysth.do")
public void test(User user) {
}

表单代码:

<form action="saysth.do" method="post">
<input name="firstName" value="张" type="text"/>
<input name="lastName" value="三" type="text"/>
......
</form>

非常简单,只需将对象的属性名和input的name值一一匹配即可。

5:多层级对象的绑定

根据URL映射到某个处理函数时,函数参数为一个复杂的bean(bean中包含其他类实例作为成员属性)。

则URL的格式为: url?一级bean中普通属性=值&一级bean中的二级bean成员属性.二级bean普通属性=值...

比如:User类中有Info类成员属性,Info类中有qq、phone属性。则请求为:url?name=aaa&info.qq=88888&info.phone=99999

6:有相同属性的对象参数绑定

根据URL映射到某个处理函数时,如果函数的有两个或以上的对象参数,并且有两个或以上的参数的实例对象有相同类型、相同名字的属性,则此时URL传过来的参数值会同时赋给拥有该同名属性的对象中去。解决办法就是使用 自定义编辑器转换数据,来规定什么格式的参数转换为哪个对象的属性值。

比如:url?user.name=111&person.name=000,自定义编辑器把 user.  定义为user实例的前缀, person. 定义为person实例的前缀。则自动把参数值传给user、person实例了。

7:List对象绑定

List需要绑定在对象上,而不能直接写在Controller方法的参数中。
Model代码:

public class User {
private String firstName;
private String lastName; public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} } public class UserListForm {//List需要绑定在一个对象中
private List<User> users; public List<User> getUsers() {
return users;
} public void setUsers(List<User> users) {
this.users = users;
} }

Controller代码:

@RequestMapping("saysth.do")
public void test(UserListForm userForm) {//用对象来接收List内容,赋给对象中的list类型成员
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
}
}

表单代码:

<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>//页面端通过 [] 为list元素属性赋值
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[2].firstName" value="eee" /></td>
<td><input name="users[2].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>

注意:这里有个坑,就是页面端如果不是顺序地为list元素赋值,如:user[0]一下子跳到了user[10],则中间user[1~9]元素属性值会是null,并且list大小为11而不是2。

8:Set对象绑定

Set和List类似,也需要绑定在对象上,而不能直接写在Controller方法的参数中。并且,必须先在Set绑定的对象的中add相应的数量的模型对象,从而创建出相应大小的set。

Model代码:

public class User {
private String firstName;
private String lastName; public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} } public class UserSetForm {
private Set<User> users = new HashSet<User>(); public UserSetForm() {//要先add相应数量的元素,创建出相应大小的set空间
users.add(new User());
users.add(new User());
users.add(new User());
} public Set<User> getUsers() {
return users;
} public void setUsers(Set<User> users) {
this.users = users;
} }

Controller代码:

@RequestMapping("saysth.do")
public void test(UserSetForm userForm) {
for (User user : userForm.getUsers()) {
System.out.println(user.getFirstName() + " - " + user.getLastName());
}
}

表单代码:

<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[2].firstName" value="eee" /></td>
<td><input name="users[2].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>

基本和List绑定类似,下标不能跳跃,不然前端传过去的set就会大于绑定对象中的set,会报错。一般不用set,很麻烦。

9:Map对象绑定

Map最为灵活,它也需要绑定在对象上,而不能直接写在Controller方法的参数中。

Model代码:

public class User {
private String firstName;
private String lastName; public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} } public class UserMapForm {//把map绑定到对象中,作为一个对象属性
private Map<String, User> users;//domain类作为value public Map<String, User> getUsers() {
return users;
} public void setUsers(Map<String, User> users) {
this.users = users;
} }

Controller代码:

@RequestMapping("saysth.do")
public void test(UserMapForm userForm) {
for (Map.Entry<String, User> entry : userForm.getUsers().entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue().getFirstName() + " - " +
entry.getValue().getLastName());
}
}

表单代码:

<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users['x'].firstName" value="aaa" /></td>//以字符串作key,user对象作为value
<td><input name="users['x'].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users['y'].firstName" value="ccc" /></td>
<td><input name="users['y'].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users['z'].firstName" value="eee" /></td>
<td><input name="users['z'].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>

10:JSON数据绑定

当客户端传过来JSON格式的内容给请求处理参数时,我们需要把JSON格式的数据转换为bean实例,可以通过 @RequestBody注解修饰函数参数,把request中body部分数据转换为对象,然后把对象作为函数参数使用。

11:XML数据绑定

XML数据绑定比JSON多一步,作为请求处理函数的参数对象在定义时,需要添加一些XML解析的注解,来表明此对象对应于xml文件中的哪个element。

然后,通过 @RequestBody注解修饰函数参数,把request中body部分的xml格式数据转换为对象,然后把对象作为函数参数使用。

SpringMVC学习笔记四:数据绑定的更多相关文章

  1. SpringMVC:学习笔记(5)——数据绑定及表单标签

    SpringMVC——数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...

  2. SpringMVC学习笔记之---数据绑定

    SpringMVC数据绑定 一.基础配置 (1)pom.xml <dependencies> <dependency> <groupId>junit</gro ...

  3. SpringMVC学习笔记(四)

    一.Controller接受网页参数. 1.使用方法的形参来接受 //使用基本类型和字符串来接受 @RequestMapping(value="/param2.do") publi ...

  4. SpringMVC 学习笔记(四) 处理模型数据

    Spring MVC 提供了下面几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据 – Map及Model: ...

  5. SpringMVC学习笔记四:SimpleMappingExceptionResolver异常处理

    SpringMVC的异常处理,SimpleMappingExceptionResolver只能简单的处理异常 当发生异常的时候,根据发生的异常类型跳转到指定的页面来显示异常信息 ExceptionCo ...

  6. SpringMVC 学习笔记(四)

    41. 尚硅谷_佟刚_SpringMVC_返回JSON.avi SpringMVC中使用@ResponseBody注解标注业务方法,将业务方法的返回值做成json输出给页面 导包: 除了一些sprin ...

  7. 史上最全的SpringMVC学习笔记

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  8. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  9. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

随机推荐

  1. 同志亦凡人第一季/全集BQueer As Folk 1迅雷下载

    同志亦凡人 第一季 Queer as Folk Season 1 (2000) 本季看点:本剧叙述一群同志男女在美国匹兹堡的生活,剧情重心由原来三位男主角Brian,Michael,Justin之间的 ...

  2. 权力的游戏第七季/全集Game of Thrones迅雷下载

    艾美及金球奖获奖HBO原创剧集<权力的游戏>第七季将于2016年夏天晚些时候开拍.新的一季共有七集,主要拍摄地为北爱尔兰,部分镜头也将在西班牙和冰岛取景.上映时间预计将略有推迟,至2017 ...

  3. ip_conntrack参数

    ip_conntrack就是linux NAT的一个跟踪连接条目的模块,ip_conntrack模块会使用一个哈希表记录 tcp 通讯协议的 established connection记录,当这个哈 ...

  4. ASP.NET Core 中间件 中间件(Middleware)和过滤器(Filter)的区别

    https://www.cnblogs.com/savorboard/p/5586229.html 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的, ...

  5. storm的一些相关文章

    文章可以看这些: https://www.cnblogs.com/zhaojiankai/p/7257617.html https://blog.csdn.net/wangshuminjava/art ...

  6. AltiumDesigner PCB布局布线过程与技巧

    首先是原理图设计. 原理图设计是前期准备工作,对简单的板子,如果熟练流程,不妨可以跳过.但是对于初学者一定要按流程来,这样一方面可以养成良好的习惯,另一方面对复杂的电路也只有这样才能避免出错.在画原理 ...

  7. 在ASP.NET MVC中以post方式传递数组参数的示例【转】

    最近在工作中用到了在ASP.NET MVC中以post方式传递数组参数的情况,记录下来,以供参考. 一.准备参数对象 在本例中,我会传递两个数组参数:一个字符串数组,一个自定义对象数组.这个自定义对象 ...

  8. Pytorch之CrossEntropyLoss() 与 NLLLoss() 的区别

    (三)PyTorch学习笔记——softmax和log_softmax的区别.CrossEntropyLoss() 与 NLLLoss() 的区别.log似然代价函数 pytorch loss fun ...

  9. Proxy 动态代理 InvocationHandler CGLIB MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. 服务器主体 "sa" 无法在当前安全上下文下访问数据库 XXX[SQLSTATE 08004] (错误 916). 该步骤失败。

    作业脚本为use XXX go 修改为选择XXX数据库