在Struts中很典型的特点就是使用了ActionForm来搜集表单数据,但是搜集到的表单数据全部都是String类型的,如果我们直接拿来使用我们会面临一个很麻烦的问题就是频繁的类型装换。Struts中使用了BeanUtils来使我们从繁重的体力劳动中解脱出来。
BeanUtils的工作原理:
我们通过一个简单的例子来了解一下他最基本的使用,首先建立一个实体类Student
package com.tgb.struts;
import java.sql.Date;
public class Student {
//姓名
private String name;
//年龄
private int age;
//生日
private Date birth;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
编写测试类
package com.tgb.struts;
import org.apache.commons.beanutils.BeanUtils;
import junit.framework.TestCase;
public class Demo2Test extends TestCase {
public void test01() throws Exception {
// 1.加载类
Class clss = Class.forName("com.tgb.struts.Student");
// 2.创建Bean对象
Student st = (Student) clss.newInstance();
// 3.通过BeanUtils给对象属性赋值
BeanUtils.setProperty(st, "name", "L。");
// 4.输出对象属性值
String str = BeanUtils.getProperty(st, "name");
System.out.println(str);
}
}
运行测试类我们会发现在控制台上的输入结果为“L。”也就是我们想要的结果。这个好像看上去很简单,BeanUtils帮我们做了什么呢:
BeanUtils的setProperty(object,name,value)方法需要的参数分别是
Object=加载类的对象
Name=类属性的名称
Value=所赋的值;
BeanUtils的getProperty(object,name)方法的返回值是String类型,所以可以直接输出;
如果我们自己写我们如何做,
首先我们需要知道Student类的属性,以及属性的类型。然后把我们想要赋值到对应属性的数据强转为可用的类型并赋值,而使用BeanUtils我们只需要知道他的属性名就可以了。数据的强转它已经帮我们做好了。
BeanUtils另一个常用的方法就是
copyProperties()
如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
而使用BeanUtils后,代码就大大改观了,如下所示:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);
如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的copyProperties()后还要加上一句:
teacher.setModifyDate(new Date());
当然以上是BeanUtils的最基本的使用,但到底他是如何
工作的呢。
我们首先看一下用于装换Integer的
IntegerConverter类的
convert方法:
public Object convert(Class type, Object value) {
//首先判断是否为空,为空抛出异常
if (value == null) {
if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException("No value specified");
}
}
//判断是否为Integer的类型,如果是直接返回,但是对于我们从表单获取的数据,总是String类型的,
//这个功能往往是在实体间赋值的时候使用。
//如果不是实体类型的就装换为实体返回。
if (value instanceof Integer) {
return (value);
}
try {
return (new Integer(value.toString()));
} catch (Exception e) {
if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException(e);
}
}
}
其实代码很好理解。其他的类型装换也都基本上相似。其实就是对我们繁杂工作的一个简单的封装,在一般的写bean组件的时候,都必须要写setter和getter方法,当然假如我们事先已经知道bean的相关属性和方法,写bean是比较简单的,但是组件太多的时候,重复编写经常是枯燥乏味令人厌烦的。但当有些时候我么需要调用动态对象的属性的时候,我们应该怎么来设定和获取对象的属性呢?BeanUtils就可以帮助我们来解决这个问题。