SpringMVC数据绑定
基本类型和包装类型的区别:
基本类型是必传的,包装类型可以不传,并且只能是int类型
基本类型加上@RequestParam(“age”),可以绑定对应名字的参数,并且可以为空
数组绑定:String[] name
可以绑定请求参数中多个相同的key的值
对象的绑定
pojo: 和指定对象里面的字段的名字相同就可以
vo: 传数据时要用“属性对象.字段“来设置多层级对象的数据
多个对象字段冲突的情况下:
会给所有对象相应字段赋值
可以用前缀来区分
//在跳转到Controller之前初始化 @InitBinder("user") public void initUser(WebDataBinder binder){ binder.setFieldDefaultPrefix("user.") }
List的绑定
传List需要新建一个数据收集对象,如ListForm, get set一下List属性字段
索引下角标传参:users[0].name=Tom&user[1].name=Lucy
list大小为下标的最大值,也就是请求的索引一定是连续的,否则会造成空索引和资源浪费
Set的绑定
同样也需要一个收集对象,和List的差不多,传参也差不多
区别:需要对Set进行初始化,传参的下标必须在set的大小范围内
一般是用来排查重复的,可以重写hashCode和equals方法来排重(但也会影响初始化的大小,如初始化时添加两个相同的对象,这时set的size是1不是2)
Map数据绑定
如果key相同认为是同一个,也需要一个数据收集对象,如UserMapForm,里面有个map< String, User>属性users (需要set,get方法)
传参:users[“x”].name=Tom&users[“x”].age=10
Json绑定
传Json数据,加注解@RequestBody, 传参时会转换为类,需要配置json转化工具,如jackson
xml数据绑定
同样加@RequestBody注解,同时配置spring-oxm的xml解析工具
相关的类上也要加上注解:
类名:@XmlRootElement(name=”admin”)
getName方法上加上@XmlElement(name=”name”)
自动转化之PropertyEditor
继承PropertyEditorSupport, 重写setAsT xt
@Override public void setAsText(String text) throws IllegalrgumentException{ User u = new User(); String[] textArray = text.split(","); u.setName(textArray[0]); u.setAge(Integer.parseInt(textArray[1])); this.setValue(u) }
日期转化:
@RequestMapping(value="date1.do") @ResponseBody public String date1(Date date1){ return date1.toStrng(); }
转换器注册:
//不是全局的 @InitBinder("date1") public void initDate1(WebDateBinder binder){ binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); //传true表示可以为空 }
自动转化之Formatter
CurrencyFormatter formatter = new CurrencyFormatter(); formatter.setFractionDigits(2); formatter.setRoundingMode(RoundingMode.CEILING); //formater能够按照规则转化数据 Assert.assertEquals(new BigDecimal("123.12"), formatter.parse("$123.125"),Locale.US)
全局的写法:
实现Formatter类,写对应的转换方法,然后在Spring中配置bean
mvc:annotation-driven conversion-service=下面的id //不加不会生效 bean id class=FormattingConversionServiceFactory property name=formatters set bean class=MyDateFormatter
自动转化之Converter
需要在Spring中注入,有多个内置实现类,内置的不可扩展
//实现方法 public class MyDateConverter implements Converter<String,Date> public Date convert(String source)
同时也要配置Spring,将上面formatter的name=formatters改为name=converters