上篇文章我们已经讨论过Java中的内省机制了,我们虽然将内省机制封装好了一个方法供给我们调用,但是它还是有一定缺陷的,缺陷1:比如说,上面那个方法只能转换8种基础数据类型,如果表单上有一个日期类型的数据,比如说表单有一个让我们填写生日的input,或者是说我们的JavaBean有有一个成员变量是Date类型的,那么我们封装的方法就不行了,这时候我们封装的方法就报错。缺陷2:其实我们还可以抛弃我们封装好的方法,替而代之是一个jar包,这个jar包中就已经封装好了内省机制。这样不更省代码吗?
1、解决缺陷1
我们应该封装好一个类,这个类负责转换这个日期类型的数据,然后我们再用内省机制给后台的Model赋值,代码如下。
public class MyConverter implements Converter {
public Object convert(Class arg0, Object arg1) {
String birthdayStr = arg1.toString();//1990-01-01 ==> date
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
return format.parse(birthdayStr);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
2、解决缺陷2
引用jar包commons-beanutils-1.8.3-bin.zip ,我们利用BeanUtils工具实现populate方法,代码如下
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
user u=new user();
try {
ConvertUtils.register(new MyConverter(), Date.class);
BeanUtils.populate(u, request.getParameterMap());
} catch (IllegalAccessException e) {
e.printStackTrace();
// TODO: handle exception
}catch(InvocationTargetException e){
e.printStackTrace();
}
ConvertUtils.register(new MyConverter(), Date.class);
populate(request.getParameterMap(),u);
System.out.println(u);
}
我们用BeanUtils工具类代替了之前封装好的方法,用MyConvert类来转换表单中的参数,当然,这个类不仅仅可以转化Date,我们还可以继续将其封装,转化其它类型的参数,用这两种方法,解决上上一篇博客中populate方法的两个缺陷,还节省了代码量,提高了工作效率。