SpringMVC数据绑定总结

来源:互联网 发布:编程语言实现模式 pdf 编辑:程序博客网 时间:2024/05/17 18:02

SpringMVC数据绑定总结

SpringMVC数据绑定 Kay 2017.7.5整理
源码地址:https://github.com/LiuKay/springmvc

1. 基本类型

推荐使用包装类型,注意@RequestParam注解的使用,其属性可以设置参数别名、设置参数是否必须,以及默认值

    @RequestMapping(value = "/baseType")    @ResponseBody  //返回值放到Response的body区    public String baseType(@RequestParam("age") int age){        //使用int类型,如果不给请求添加age值,则会报错        //使用Integer包装类型不会报错,显示null        return "age:"+age;    }
    @RequestMapping(value = "/WrapType")    @ResponseBody    public String baseType(Integer age){        return "age:"+age;    }

2. 数组

//数组绑定  /arrayType?name=tom&name=lucy    @RequestMapping("/arrayType")    @ResponseBody    public String array(String[] name){        StringBuilder sb=new StringBuilder();        for (String item :name){            sb.append(item).append(" ");        }        return sb.toString();    }

3. 对象

//todo 对象绑定 /objectType?name=tom&age=10//todo 复合对象 ///objectType? name=tom&age=10&contactinfo.phone=10086&contactinfo.address=china    //todo 属性的多个对象 /objectType?user.name=tom&age=10    @RequestMapping("/objectType")    @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 集合数据绑定    //todo 数据收集对象UserListForm,绑定的是里面的users对象    //todo  /list?users[0].name=tom&users[1].name=lucy    // 请求索引要连续,不然会浪费很多空间(空对象)    @RequestMapping(value = "/list")    @ResponseBody    public String list(UserListForm userList){        return userList.toString();    }

Set

//todo set的绑定与list的不同,set要初始化size大小,源码里面会判断index与size关系    // set 主要判断重复,在初始化set对象大小之后,重写hashcode和equals方法,空对象1个,size为1    // /set?users[0].name=tom&users[1].name=lucy    @RequestMapping(value = "/set")    @ResponseBody    public String set(UserSetForm userSet){        return userSet.toString();    }

Map

//todo /map?users['x'].name=tom&users['y'].name=lucy    @RequestMapping(value = "/map")    @ResponseBody    public String map(UserMapForm userMap){        return userMap.toString();    }

5. Json数据

在maven配置文件中加入jackson-databind的jar包依赖支持对json的解析

//todo json绑定 Content-Type:application/json    // {    //  "name":"tom",    //            "age":10,    //            "contactInfo":{    //        "address":"shenzhen",    //                "phone":10086    //    }    //}    @RequestMapping(value = "/json")    @ResponseBody    public String json(@RequestBody User user){        return user.toString();    }

6. XML

//todo xml绑定 需要加入spring-oxm的jar包以及对象添加xml的注解 //Content-Type:application/xml    // <?xml version="1.0" encoding="UTF-8"?>    //<admin>    //    <name>tom</name>    //    <age>10</age>    //</admin>    @RequestMapping(value = "/xml")    @ResponseBody    public String xml(@RequestBody Admin admin){        return admin.toString();    }

对Admin类的修改:

package kay.model;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;/** * Created by kay on 2017/7/5. */@XmlRootElement(name="admin")  //xml根节点public class Admin{    private String name;    private String age;    @Override    public String toString() {        return "Admin{" +                "name='" + name + '\'' +                ", age='" + age + '\'' +                '}';    }    @XmlElement(name="name")   //xml属性节点    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @XmlElement(name="age") //xml属性节点    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }}

7. 数据格式转换

Spring支持的数据格式转换的三种接口

以Date类型为例:
第一种方式,使用PropertyEditor的实现类,使用CustomDateEditor这个类进行类型绑定
此方式配置的格式转换只在当前controller类中对一个属性生效

 //todo 日期转换 /dateType?date1=2017-07-05     @RequestMapping(value = "/dateType")    @ResponseBody    public String date1(@RequestParam("date1") Date date1){        return  date1.toString();    }    //todo 局部有效,只在这个controller里面    @InitBinder("date1")    public void initDate1(WebDataBinder binder){        binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat(                "yyyy-MM-dd"),true));    }

第二种方式,实现Formatter接口,并在配置文件中配置bean对象

public class MyDateFormatter implements Formatter<Date>{    public Date parse(String s, Locale locale) throws ParseException {        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");        return sdf.parse(s);    }    public String print(Date date, Locale locale) {        return null;    }}

配置:

<mvc:annotation-driven conversion-service="myDateFormatter"/><!--todo 配置了一个全局的日期转换器 -->    <bean id="myDateFormatter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">        <property name="formatters">            <set>                <bean class="kay.utils.MyDateFormatter"/>            </set>        </property>    </bean>

第三种,实现Converter接口,并在配置文件中配置bean

/** * Created by kay on 2017/7/5. * Converter 接口可以自定义转换源的类型 */public class MyDateConverter implements Converter<String,Date>{    public Date convert(String s) {        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");        try {            return simpleDateFormat.parse(s);        } catch (ParseException e) {            e.printStackTrace();        }        return null;    }}

配置和上一种方法类似

<mvc:annotation-driven conversion-service="myDateConverter"/><bean id="myDateConverter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">        <property name="converters">            <set>                <bean class="kay.utils.MyDateConverter"/>            </set>        </property>    </bean>

从Formatter接口和Converter接口的实现来看,Formatter只能从String类型转换,而Converter接口可以定义从任何类型转换成想要的类型。

原创粉丝点击