Struts中ActionForm Bean和valueObject之间的问题

03-08-01 anonymous
在struts中油ActionFormBean负责从前台取数据和将数据传回前台显示,其本省是一个很标准的javabean,
而在后台数据处理时往往需要一个valueObject来存放数据
举个例子:用户信息
那么,在前台时必然需要一个ActionFormBean:
UserInfoFormBean
存放Name、Password、Sex、Age等等属性和各自的存取方法
还有继承自ActionForm的reset validate等方法

而在数据存取层中需要一个valueObject:
UserInfoBean:
同样存放的是Name、Password、Sex、Age等等属性和各自的存取方法

因此,这两个类将是非常相像的,但很多时候不能共用,因为会增加系统的耦合度,
但若分开又重复工作很多,而且两个类间的“同步(比如属性名或方法的更改等)“可能有问题,
不知道各位在实际应用中有什么好的方法或经验?


看到过的一个例子时放开写,在action中用commons-beanutli的bean复制在两个类间交换数据,倒是很方便

robbin
2003-08-01 11:52
必须分开写!ActionFormBean对应HTML的form,页面流程一改,Bean就要相应修改。Value Object是业务层的数据封装,两者不是一回事,除非小项目,大项目中不应该有大量重复的现象。

banq
2003-08-01 18:56
struts的ActionForm做得不是很灵活,以后估计可以具有拓展性,这样少一些VO,也就是DTO啊。

anonymous
2003-08-02 08:39
ActionForm和ValueObject中基本属性和方法几乎是一样的,所以感觉写两个类似的类的时候非常别扭,很重复,而且java不支持多重继承,不然倒是很好办,呵呵ValueObject是必须的,ActionForm倒是可以用DynaActionForm等动态构建,
不过总觉的有点不爽,唉,人懒倒连Ctrl+C Ctrl+V都不想干了:P:P呵呵

tyrones
2003-08-02 13:38
我的理解是:
1。对于CUD操作,由于流程是前端到后端,最终变成持久实体存储,所以可以用FORM or VO,都表示持久对象。至于分歧产生自分割俩层的业务层。由于对于页面数据要对1..*个DB Schema,所以要将FORM转换成VO。

2。对于R操作,流程是后端到前端,最终将最为临时的对象被去除(用户另行查找或关闭页面)。所以后端取出的是临时对象,我们也在这里用transient约束。转换也可发生在业务层,或直接显示。

对于2的理解,举例子如下:你从数据库查看一表中信息,在查看中,信息被更新,你用另一个session再次观看信息,如果从后端取出的信息存储在持久类中,此时持久类与表中信息将不一致。所以取出存放的信息应放在暂态类中。

不知道理解是否有误。

dengpanlong
2003-11-30 22:38
我也碰到相同的问题.

我的想法是能不能改造struts controller 使ActionForm和vo合二为一
其实ActionForm与vo的差异在于它们的父类不同。
vo必须是可串行化的(Serializable),而actionform好像不行,我们做过试验,希望把actionForm传递给ejb但是不成功。

struts controller的就是利用javabean的映射机制和servlet的实现机制构造而成的。
action 相对于普通的servlet多了两个入口参数,actionform和actionmapping.actionmapping实际上也可由httprequest实现的。

在了解actionservlet的实现原理后(分析源代码)后,是否能够自己构造一个struts controller 然后,构造处一个满足原有actionform的功能又能够满足VO的要求的新actionform

dengpanlong
2003-11-30 22:49
怎么我点击预览文章就发表了??

我是一个新手,上面只是我的一个初步的想法,好象实现起来比较有难度,还涉及到读写xml文件的问题.

请问,我的想法有没有问题,这样做有没有意义????
谢谢!!!!!!

有时间的话,我想尝试一下.

crogers
2003-11-30 23:55
> 我也碰到相同的问题.
>
> 我的想法是能不能改造struts controller
> 使ActionForm和vo合二为一
> 其实ActionForm与vo的差异在于它们的父类不同。
> vo必须是可串行化的(Serializable),而actionform好像不
> 校颐亲龉匝椋MactionForm传递给ejb但是不成功。
>
>
> struts
> controller的就是利用javabean的映射机制和servlet的实现?> 制构造而成的。
> action
> 相对于普通的servlet多了两个入口参数,actionform和actio
> mapping.actionmapping实际上也可由httprequest实现的。
>
> 在了解actionservlet的实现原理后(分析源代码)后,是否能
> 蛔约汗乖煲桓struts controller
> 然后,构造处一个满足原有actionform的功能又能够满足VO的
> 蟮男actionform
哦,我觉得,关于actionform是否等同vo要评估实际情况
但是,想把ActionForm传EJB就很容易
改Structs,吧ActionForm定义implement了Seriable~~

robbin
2003-12-01 12:29
我的意见还是分开写!!!!不要搞在一起,千万不要。


现在代码辅助功能多的很了,你在Eclipse里面多做不了什么工作的,但是你把FormBean和VO绑在一起的后果就是耦合性非常高,一改Form,就的从头改到尾,连数据库表结构都要改。

在我看来,这是一个“罪恶”的讨论。

jakarta99
2003-12-01 19:05
i agree robbin

neutrino
2003-12-03 13:12
to crogers:
拜托,写文章前能不能先查一下资料?ActionForm本来就是可序列化的

public abstract class ActionForm
    implements Serializable
<p class="indent">

我在一个项目中就用ActionForm直接代替ValueObject,很方便,也没看到有什么大问题。只是部署时候要小心点,因为web层和ejb层都用到了ActionForm容易引起版本不一致。

crogers
2003-12-03 13:46
> to crogers:
>
> 拜托,写文章前能不能先查一下资料?ActionForm本来就是?> 序列化的
>
>
> public abstract class ActionForm
> implements Serializable
> 

> 我在一个项目中就用ActionForm直接代替ValueObject,很方?> ,也没看到有什么大问题。只是部署时候要小心点,因为web?> 和ejb层都用到了ActionForm容易引起版本不一致。

啊哦,我还真没查,因为用得少,只是楼主说不能传,才指出这个问题
另,web和ejb都用了actionform,土的大可以设置系统级classpath,洋的大可以用EAR来解决版本不一致问题(如果web和ejb不在同一个机器上,当我没说过;pp)