今天回顾BeanUtils的时候,发现了一些以前没有注意的地方,并且为此花费了很长时间,特别是对于converter转换器的认识上。先贴上代码段:
String name = request.getParameter("name");
String age = request.getParameter("age");
String birthday = request.getParameter("birthday");
User user = new User();
try {
// 注册一个日期转换器
//直接调用DateLocaleConverter转换器
//ConvertUtils.register(new DateLocaleConverter(), Date.class);
//自定义日期转换器
System.out.println(1);
ConvertUtils.register(new Converter() {
public Object convert(Class type, Object value) {//type为想要转化的类型
// String --> Date 的转换
System.out.println("type:"+type);
String birth = (String) value;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
System.out.println(2);
try {
Date birthday = sdf.parse(birth);
return birthday;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}, Date.class);
System.out.println(3);
//多种格式转换日期
// DateConverter converter = new DateConverter();
// converter.setPatterns(new String[]{"yyyy-MM-dd", "yyyyMMdd","MM/dd/yyyy"});
// ConvertUtils.register(converter, Date.class);
BeanUtils.setProperty(user, "name", name);
System.out.println(4);
BeanUtils.setProperty(user, "age", age);
System.out.println(5);
BeanUtils.setProperty(user, "birthday", birthday);
System.out.println(6);
} catch (Exception e) {
e.printStackTrace();
}
//结果为
//1
//3
//4
//5
//type:class java.util.Date
//2
//6
起初,最令我疑惑的就是自定义转换器的时候,type和value是从哪里获取的,因为前面并没有提及。查阅了一些资料,再加上自己的猜想验证,我通过对关键步骤排序,得出结论:
当BeanUtils调用setProperty方法遇到处理与register后面class参数相同类型的数据时才调用register,再调用其转换器的convert方法进行转换。大家都知道setProperty可以在基本数据类型范围内进行自动转换,在我理解,这个register就是BeanUtils在基本数据类型之外的一种转换方法。
以上都是我这个菜鸟的个人理解,如果有什么不对的地方,还望大牛指出,加以改正。