SpringMVC数据绑定
数据绑定是将控件属性绑定到一个对象属性上的方法。
基础知识
1.分为三种类型:基本类型(int),包装类型(integer),数组。
基本类型的key是必须传的,只能是int类型的。
包装类型的key可以不传,integer可以为空的。
integer类型可以为空。
int不能为空
@RequestParam注解可以配置是否需要为空@RequestParam详解。
@RequestMapping注解详解。
@ResponseBody说明方法返回值放在Body数据区中。
1.基本类型处理
//todo http://localhost:8080/baseType.do?age=10
//todo 500 http://localhost:8080/baseType.do
//todo 400 http://localhost:8080/baseType.do?age=abc
@RequestMapping(value = "baseType.do")
@ResponseBody
public String baseType(int age){
return "age:"+age;
}
2.包装类处理
//todo http://localhost:8080/baseType2.do?age=10
//todo http://localhost:8080/baseType2.do
//todo 400 http://localhost:8080/baseType2.do?age=abc
@RequestMapping(value = "baseType2.do")
@ResponseBody
public String baseType2(Integer age){
return "age:"+age;
}
3.数组类处理
//todo http://localhost:8080/array.do?name=Tom&name=Lucy&name=Jim
@RequestMapping(value = "array.do")
@ResponseBody
public String array(String[] name){
StringBuilder sbf = new StringBuilder();
for(String item : name){
sbf.append(item).append(" ");
}
return sbf.toString();
}
3.简单对象与多层级对象及同属性多对象
@InitBinder注解解决同属性多对象问题
//todo http://localhost:8080/object.do?name=Tom&age=10 简单对象
//TODO http://localhost:8080/object.do?name=Tom&age=10&contactInfo.phone=10086 多层级对象
//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.");
}
4.List类处理
//TODO http://localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy
//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();
}
5.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();
}
UserSetForm代码如下:
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 +
'}';
}
}
注意set的数据绑定需要重写equals()方法和hashcode()方法来实现重复判断逻辑。虽然user.add()有两个,但是如果key重复,也会自去除一个,如下面的图片所示:
6.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();
}
7.json数据绑定
// {
// "name": "Jim",
// "age": 16,
// "contactInfo": {
// "address": "beijing",
// "phone": "10010"
// }
// }
//application/json
@RequestMapping(value = "json.do")
@ResponseBody
public String json(@RequestBody User user){
return user.toString();
}
8.xml数据绑定
// <?xml version="1.0" encoding="UTF-8" ?>
// <admin>
// <name>Jim</name>
// <age>16</age>
// </admin>
//application/xml
@RequestMapping(value = "xml.do")
@ResponseBody
public String xml(@RequestBody Admin admin){
return admin.toString();
}
//下面是Admin类的实现
@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 +
'}';
}
}
9.自定义的类型转化器
——PropertyEditor(这是一个接口)一般不直接实现这个接口,而是通过继承PropertyEditorSupport来扩展的。如下图所示,函数能将逗号前后的内容分别赋值给u.name和u.age。
public class MyPropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
User u = new User();
String[] textArray = text.split(",");
u.setName(textArray[0]);
u.setAge(Integer.parseInt(textArray[1]));
this.setValue(u);
}
public static void main(String[] args) {
MyPropertyEditor editor = new MyPropertyEditor();
editor.setAsText("tom,22");
System.out.println(editor.getValue());
}
}
——Formatter(格式化器,也是一个接口)比如说拥有货币转换等的接口
——Converter<source,target>(一个接口,不可扩展)