基本类型

最好使用封装类型

简单多数据&多层级对象

简单多数据

单个对象,直接使用属性名=值即可

多层级对象

属性.属性=值即可

同属性多对象

WebDataBinder只在当前类中生效,不是全局的

    //TODO http://localhost:8080/object.do?user.name=Tom&admin.name=Lucy&age=10
@RequestMapping(value = "object.do")
@ResponseBody
public String object(User user,Admin admin){
return user.toString()+" "+admin.toString();
} @InitBinder("user")
public void initUser(WebDataBinder binder){
binder.setFieldDefaultPrefix("user.");
}
@InitBinder("admin")
public void initAdmin(WebDataBinder binder){
binder.setFieldDefaultPrefix("admin.");
}

List、Set、Map类型的数据绑定

list

下标,最好是连续的,不然中间都是null

//TODO http://localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy&users[20].name=Jim
@RequestMapping(value = "list.do")
@ResponseBody
public String list(UserListForm userListForm){
return "listSize:"+userListForm.getUsers().size() + " " + userListForm.toString();
} public class UserListForm {
private List<User> users; public List<User> getUsers() {
return users;
} public void setUsers(List<User> users) {
this.users = users;
} @Override
public String toString() {
return "UserListForm{" + "users=" + users + '}';
}
}

Set

主要是用来去除重复,初始化时,需要设置大小。

//TODO http://localhost:8080/set.do?users[0].name=Tom&users[20].name=Lucy
@RequestMapping(value = "set.do")
@ResponseBody
public String set(UserSetForm userSetForm){
return userSetForm.toString();
} public class UserSetForm {
private Set<User> users; private UserSetForm(){
users = new LinkedHashSet<User>();
users.add(new User());
users.add(new User());
} public Set<User> getUsers() {
return users;
} public void setUsers(Set<User> users) {
this.users = users;
} @Override
public String toString() {
return "UserSetForm{" + "users=" + users + '}';
}
}

Map

//TODO http://localhost:8080/map.do?users['X'].name=Tom&users['X'].age=10&users['Y'].name=Lucy
@RequestMapping(value = "map.do")
@ResponseBody
public String map(UserMapForm userMapForm){
return userMapForm.toString();
} public class UserMapForm {
private Map<String,User> users; @Override
public String toString() {
return "UserMapForm{" + "users=" + users + '}';
} public Map<String, User> getUsers() {
return users;
} public void setUsers(Map<String, User> users) {
this.users = users;
}
}

Json、Xml数据类型的绑定

JSON

User类有name与age属性,并包含一个contactInfo

//    {
// "name": "Jim",
// "age": 16,
// "contactInfo": {
// "address": "beijing",
// "phone": "10010"
// }
// }
//content-Type:application/json
@RequestMapping(value = "json.do")
@ResponseBody
public String json(@RequestBody User user){
return user.toString();
}

XML

//    <?xml version="1.0" encoding="UTF-8" ?>
// <admin>
// <name>Jim</name>
// <age>16</age>
// </admin>
//content-Type:application/xml
@RequestMapping(value = "xml.do")
@ResponseBody
public String xml(@RequestBody Admin admin){
return admin.toString();
} @XmlRootElement(name="admin")
public class Admin {
private String name;
private Integer age; @XmlElement(name="name")
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @XmlElement(name="age")
public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Admin{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}

格式化工具和类型转换器

应用:前台传入一字符串,后台接收一个java.util.Date类型

PropertyEditor的应用

内置的可扩展性;局部使用webdatabinder

binder.registerCustomEditor

    // http://localhost:8080/date1.do?date1=2016-07-18
@RequestMapping(value = "date1.do")
@ResponseBody
public String date1(Date date1){
return date1.toString();
} @InitBinder("date1")
public void initDate1(WebDataBinder binder){
binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}

PropertyEditorSupport有很多子类,可以根据使用场景来选择

Formatter的应用

内置的可扩展性;全局/局部;Source=String

  • 添加自定义的formatter
public class MyDateFormatter implements Formatter<Date> {

    public Date parse(String text, Locale locale) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(text);
} public String print(Date object, Locale locale) {
return null;
}
}
  • 配置,全局生效
<!-- 如果不加conversion-service是不会生效的 -->
<mvc:annotation-driven conversion-service="myDateFormatter"/> <bean id ="myDateFormatter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class="com.imooc.common.MyDateFormatter"></bean>
</set>
</property>
</bean>
  • 使用,由于当前MyDateFormatter是全局生效,所有直接使用Date即可,不需要WebDataBinder了
    @RequestMapping(value = "date2.do")
@ResponseBody
public String date2(Date date2){
return date2.toString();
}

Converter的应用

内置的不可扩展性;全局/局部;Source=自定义的

与Formatter类似,Converter高级一些,可设置Source

  • 实现converter
public class MyDateConverter implements Converter<String,Date> {
public Date convert(String source) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
  • 配置,全局生效
<!-- 如果不加conversion-service是不会生效的 -->
<mvc:annotation-driven conversion-service="myDateConverter"/> <bean id ="myDateConverter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.imooc.common.MyDateConverter"></bean>
</set>
</property>
</bean>
  • 使用,由于当前MyDateConverter是全局生效,所有直接使用Date即可,不需要WebDataBinder了
    @RequestMapping(value = "date2.do")
@ResponseBody
public String date2(Date date2){
return date2.toString();
}

RESTful

Resource Representational State Transfer

资源表现层状态转换

表现层:如果图片可以表现为jpg、png等

表现形式:content-Type

幂等性:每次HTTP请求相同的参数,相同的URI,产生的结果是相同的

@RequestMapping(value = "/book",method = RequestMethod.GET)
@ResponseBody
public String book(HttpServletRequest request){
String contentType = request.getContentType();
if(contentType == null){
return "book.default";
}else if(contentType.equals("txt")){
return "book.txt";
}else if(contentType.equals("html")){
return "book.html";
}
return "book.default";
} @RequestMapping(value = "/subject/{subjectId}",method = RequestMethod.GET)
@ResponseBody
public String subjectGet(@PathVariable("subjectId") String subjectId){
return "this is a get method,subjectId:"+subjectId;
} @RequestMapping(value = "/subject/{subjectId}",method = RequestMethod.POST)
@ResponseBody
public String subjectPost(@PathVariable("subjectId") String subjectId){
return "this is a post method,subjectId:"+subjectId;
} @RequestMapping(value = "/subject/{subjectId}",method = RequestMethod.DELETE)
@ResponseBody
public String subjectDelete(@PathVariable("subjectId") String subjectId){
return "this is a delete method,subjectId:"+subjectId;
} @RequestMapping(value = "/subject/{subjectId}",method = RequestMethod.PUT)
@ResponseBody
public String subjectPut(@PathVariable("subjectId") String subjectId){
return "this is a put method,subjectId:"+subjectId;
}
  • RESTful设计
moive/douban.com/show/subject/11620560  # 不正确,不应有动词show
moive/douban.com/subject/11620560 # 正确 POST /accounts/1/transfer/500/to/2 # 不正确,不应有动词trfansfer
POST /transaction # 正确
from=1&to=2&amount=500.00 www.example.com/app/1.0 # 不正确
www.example.com/app # 正确
HEADER
version=1.0

《SpringMVC数据绑定入门》笔记的更多相关文章

  1. HTML+CSS笔记 CSS笔记集合

    HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...

  2. CSS笔记--选择器

    CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...

  3. HTML+CSS笔记 CSS中级 一些小技巧

    水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...

  4. HTML+CSS笔记 CSS中级 颜色&长度值

    颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...

  5. HTML+CSS笔记 CSS中级 缩写入门

    盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...

  6. HTML+CSS笔记 CSS进阶再续

    CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...

  7. HTML+CSS笔记 CSS进阶续集

    元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...

  8. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  9. HTML+CSS笔记 CSS入门续集

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...

  10. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

随机推荐

  1. 图像操作相关 With Quartz 2D

    本文将为大家介绍常见的IOS图像处理操作包括以下四部分:旋转,缩放,裁剪以及像素和UIImage之间的转化,主要使用的知识是quartz2D.Quartz2D是CoreGraphics框架中的一个重要 ...

  2. POJ 2635 The Embarrassed Cryptographer(大数求余)

    题意:给出一个大数,这个大数由两个素数相乘得到,让我们判断是否其中一个素数比L要小,如果两个都小,输出较小的那个. 分析:大数求余的方法:针对题目中的样例,143 11,我们可以这样算,1 % 11 ...

  3. Linux学习 -- 权限管理

    1 ACL权限 1.1 简介与开启 1.1.1 ACL权限是什么 access control list 访问控制表 解决传统的(owner,group,others)身份不足的情况 可以设置 特定用 ...

  4. 转:Selenium2.0介绍——WebDriver两种驱动浏览器的方式.

    如果之前熟悉Selenium RC,理解了Selenium RC是如何工作的,那么,当第一次接触Selenium WebDriver的时候,看到WebDriver居然可以不需要指定远端服务器的IP地址 ...

  5. jq中的css-Dom

    1,height() ,width() 此方法用来获取匹配元素的高和宽的值,如果括号内有值,则是修改匹配元素的值, 2.offset() 此方法的作用是获取元素在当前视窗的相对偏移,其中返回的对象包含 ...

  6. 链表基础 HDU1267

    基础的链表,模拟一下就好了...就签个到

  7. OpenGL------三维变换

    我们生活在一个三维的世界——如果要观察一个物体,我们可以:1.从不同的位置去观察它.(视图变换)2.移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它.(模型变换)3.如果把物 ...

  8. (转)Hadoop之常见错误集锦

     Hadoop之常见错误集锦            下文中没有特殊说明,环境都是CentOS下Hadoop 2.2.0.1.伪分布模式下执行start-dfs.sh脚本启动HDFS时出现如下错误:   ...

  9. 序列化为XML

    java类序列化成xml 方法[转] 今天看了下JAVA序列化.还是一知半解.怎么也没有弄明白,怎么序列化成XML文件.处入半解状态.在网上找了很多,大部分是理论上的.没有实际的例子.功夫不负有心人, ...

  10. 请问如何在PS中将一张图标里的各个小图标分离成一个个图标?

    1.用切片工具比较简单快捷,把要切的图标一个个的切画出来,切好后存储保存格式为web,导出时候会出现一个images文件里面就是刚切好的图片 2.用裁剪的方式裁剪你要小图标,(你可以记住第一个裁剪的长 ...