`

struts中将formbean属性迅速转型解决之道

阅读更多
org.apache.commons.beanutils.BeanUtils用法
BeanUtils简读本
一、简介:

BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

二、用法:

BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:
public static void copyProperties(java.lang.Object dest,java.lang.Object orig)   throws java.lang.IllegalAccessException,          java.lang.reflect.InvocationTargetException 


如果你有两个具有很多相同属性的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);
[color=red]    
//而使用BeanUtils后,代码就大大改观了,如下所示[/color]


//得到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外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:

     * java.lang.BigDecimal     * java.lang.BigInteger     * boolean and java.lang.Boolean     * byte and java.lang.Byte     * char and java.lang.Character     * java.lang.Class     * double and java.lang.Double     * float and java.lang.Float     * int and java.lang.Integer     * long and java.lang.Long     * short and java.lang.Short     * java.lang.String     * java.sql.Date     * java.sql.Time     * java.sql.Timestamp 


这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

三、优缺点:

Apache Jakarta Commons项目非常有用。在较多的项目上或直接或间接地使用流行的commons组件。
其中的一个强大的组件就是BeanUtils,如在开发中用例代码

/**
		 * 将FormBean中的内容通过BeanUtils的copyProperties()绑定到Object中.
		 * 因为BeanUtils中两个参数的顺序很容易搞错,因此封装此函数。
		 */
		protected void bindObject(ActionForm form, Object object) {
			try {
				BeanUtils.copyProperties(object, form);
			} catch (IllegalAccessException e) {
				log.error("Bind object from form error:" + e.getMessage());
			} catch (InvocationTargetException e) {
				log.error("Bind object from form error:" + e.getMessage());
			}
		}

		/**
		 * 将Object内容通过BeanUtils的copyProperties 复制到FormBean中。
		 * 因为BeanUtils中两个参数的顺序很容易搞错,因此封装此函数。
		 */
		protected void bindForm(ActionForm form, Object object) {
			try {
				BeanUtils.copyProperties(form, object);
			} catch (Exception e) {
				log.error("Set form from object error:" + e.getMessage());
			}
		}



我将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:


BeanUtils.copyProperties(aValue, aLocal) 



上面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用了!

现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!
分享到:
评论

相关推荐

    Struts中FormBean的日期类型字段赋值自动转化

    当用户提交表单时,Struts框架会自动将请求参数填充到对应的FormBean属性中。 二、日期类型的处理 在实际应用中,我们可能会遇到需要处理日期类型的字段。Java中常用的日期类型有`java.util.Date`、`java.sql.Date`...

    Struts1.2动态FormBean加验证功能的一个例子

    要实现动态FormBean,你需要在struts-config.xml配置文件中定义一个ActionFormBean,指定它的属性和验证规则。例如: ```xml <form-bean name="dynamicForm" type="org.apache.struts.action.DynaActionForm"> ...

    struts2 (对象.属性)注入

    在Struts1框架中,每当提交表单时,表单中的属性值首先会被赋给FormBean对象。开发者需要为每一个表单创建一个对应的FormBean类,并且在该类中定义与表单字段相对应的属性及对应的getter和setter方法。这种方式虽然...

    struts1&struts2

    Action类需要继承`org.apache.struts.action.Action`,并且表单数据通常封装在FormBean中。为了获取这些数据,开发者需要将Bean存入Page、Request或Session范围。 - **Struts2** 则是一个pull-MVC架构,它允许...

    Eclipse开发Struts1.2

    - 在`struts-config.xml`中定义FormBean,并在Action类中使用get和set方法访问其属性。 11. **JSP页面**: - JSP页面负责显示数据和接收用户输入,通过Struts标签库(如struts-tiles或struts-bean标签)与...

    json java读取 formbean操作

    - **嵌套的FormBean**:如果JSON包含嵌套的对象,对应的FormBean也需要有相应的嵌套属性。 - **List或Array**:如果JSON数组对应Java的集合类型,如List,我们需要使用泛型。 在实际开发中,通常会结合使用这些库,...

    使用 Easy Struts for Eclipse 开发 Struts

    通过使用 Easy Struts 提供的一系列功能,开发者能够快速搭建起一个完整的 Struts 应用框架,并在此基础上实现更多的功能扩展。无论是对于初学者还是有经验的开发者来说,Easy Struts 都是一款非常实用且易于上手的...

    Struts1_Struts2

    Struts1的配置主要在struts-config.xml文件中进行,包括Action映射、FormBean定义和Plug-In配置等。 - **MVC架构**:Struts1遵循MVC设计模式,使得开发者可以将业务逻辑、数据模型和用户界面分离,提高代码的可重用...

    Struts所需要的jar

    1. **struts-core.jar**:这是Struts框架的核心库,包含了Action、ActionSupport、FormBean等基础类,以及配置解析、请求处理等关键组件。 2. **struts-tiles.jar**:Tiles是一个视图管理框架,它允许开发者定义和...

    struts1和struts2中文教程

    2. **配置文件**:struts-config.xml是核心配置文件,包含了Action、ActionMapping、FormBean和Result的定义,这些定义指导了请求如何被处理并跳转到相应视图。 3. **Tiles框架**:Struts1可以与Tiles框架结合使用,...

    struts1编程例子

    2. **使用向导创建Form、Action和JSP**:利用MyEclipse的向导功能,可以快速创建FormBean、Action和对应的JSP页面。在向导中,指定usecase为“userLogin”,FormBean的名称通常与struts-config.xml中的`<form-bean>`...

    struts html标签例子

    2. `<html:text>`:用于创建输入文本字段,其`name`属性对应ActionForm中的属性名,这样表单提交后,Struts框架会自动将该字段的值绑定到对应的ActionForm属性。 3. `<html:password>`:与`<html:text>`类似,但...

    struts2.0之action

    在Struts 1.x中,Action类需要继承`org.apache.struts.action.Action`或其子类,同时表单数据会封装在FormBean中。而Struts 2.0则更加灵活,Action类不再需要强制继承特定的类或实现特定的接口。表单数据直接包含在...

    struts-1.3.5-lib

    1. **核心库**:struts-1.3.5.jar 包含了Struts框架的核心类,如Action、FormBean、ActionServlet等。这些类负责处理HTTP请求,执行业务逻辑,并将结果传递给视图层。 2. **标签库**:struts-tags.jar 提供了一系列...

    struts-config文件标签详解

    ClassName 属性指定了 FormBean 的实现类,name 属性指定了 FormBean 的名称,type 属性指定了 FormBean 的类型。 在 Form-bean 元素中,我们可以使用 Form-property 元素来设置 FormBean 的属性。Form-property ...

    Struts的工作原理

    Struts是一个基于Model-View-Controller (MVC)设计模式的Java Web框架,它使得开发者能够更有效地构建可维护和可扩展的Web应用程序。在深入理解Struts的工作原理之前,我们先来简单回顾一下MVC模式的基本概念: **...

    struts2的新特性

    ### Struts2的新特性详解 #### 一、总体变化及模式变动 **1. Action从Singleton到Prototype** 在Struts1中,为了确保线程安全,Action被设计为Singleton模式,这意味着所有请求共享同一个Action实例。这就导致了...

Global site tag (gtag.js) - Google Analytics