在Action控制中转化po --> formBean的提问?

qingzhuang 2005-11-18 09:35:19
如果返回的是集合类的,大家是如何转化的?假设BeanUtils.copyProperties(form,pi)方法成立,我想写个公共的方法实现返回集合类型的,参数类型不限,不要把代码写太多在Action,大家给个思路,谢谢!
...全文
287 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
DanielYWoo 2005-11-22
  • 打赏
  • 举报
回复
个人认为99%的情况下都不应该用actionForm替代PO VO.如果系统真的简单到actionForm可以替代PO的时候,我会不使用struts,不使用actionForm,但是我还会使用PO.

至于actionForm到VO,PO的映射,以前因为EJB2的接口局限,PO VO(domain object)是严格分开的,还有DTO Factory之类的模式。现在Hibernate/EJB3可以用POJO,不需要实现特定接口,现在有种趋势,就是把VO/PO统一起来了。
qingzhuang 2005-11-22
  • 打赏
  • 举报
回复
我写的一个流程的程序的一般包含四个类,分别是
MobileInfoForm.java,MobileInfoAction.java
,MobileInfoLogic.java,MobileInfoDAO.java
一般po与formbean的转化是在Action转化。曾想在Logic类如MobileInfoLogic.java中转化,
参考了一些文章,结果放置在Action中转化。
当然我假设的BeanUtils.copyProperties(form,po)方法可行是只一部分,一部分还是需要
form,po 一一对应来转化。现在想找个好点的方法类解决这个问题。看了大家的意见还是有收获。

myth822 2005-11-22
  • 打赏
  • 举报
回复
如果你只是说一个单纯的查询系统,没有事务,关联...,PO可能没有必要存在
MYLiao 2005-11-21
  • 打赏
  • 举报
回复
关注,期待高手。
青蛙 2005-11-21
  • 打赏
  • 举报
回复
.net有一个名词叫“对象映射”,传入对象名称,返回对象类型。
不知道java有没有这个说法?

也想知道,UP一下。
qingzhuang 2005-11-21
  • 打赏
  • 举报
回复
再顶,up给分
nighthawk 2005-11-21
  • 打赏
  • 举报
回复
关于PO,已经存在了太多的争论了,至于使用PO的意义,你也说的很清楚,想必大家都很清楚,我不想再重复。
我没有说过任何情况下都不使用PO。
我从头到尾反复强调一点:并不是所有的情况下它都有必要存在!
比如说一个完完全全的查询系统。
请结合我前面的所指的前提条件,再次权衡PO的意义。
个人认为如果为了完全遵守某个规则而去平添麻烦甚至以性能为代价是很不值得的。

很遗憾没有看到您的正面回答。
myth822 2005-11-21
  • 打赏
  • 举报
回复
我也只是提出个人观点,在一个系统中不可能将简单的业务做成2层,将复杂的业务做成3层,而且当你的view层直接操作PO时,导致的结果可能是发生的改变直接反映到数据库中,这可能对Model层造成破坏!

nighthawk 2005-11-21
  • 打赏
  • 举报
回复
“任何情况都不赞成”这句话我会理解成任何情况下都需要PO。
我希望听到的是理由,而不是一句话。不管对与错,我想这是不仅是为楼主负责,也更是帮助了浅薄的我:),
前提:
1,业务逻辑并不复杂。
2,不受事务影响。
3,DAO在这个时候也许显得多余。
本人无知,望多指点。
zeq258 2005-11-21
  • 打赏
  • 举报
回复
一般的情况,是需要把po 和 vo 区分开。

使得传回也面的,是一个vo,不和逻辑有任何关系。

一般的系统都不需要这么做,不要求这么高的安全性!

个人见解!
myth822 2005-11-21
  • 打赏
  • 举报
回复
任何情况都不赞成
nighthawk 2005-11-21
  • 打赏
  • 举报
回复
我没有说任何情况下都用form取代PO,请看清楚我的前提。
myth822 2005-11-21
  • 打赏
  • 举报
回复
首先不赞成form取代PO,这样在view层的操作可能直接影响到底层的DAO

一般在Action和DAO之间会有一个service,可以在那里面进行bean的copy
DanielYWoo 2005-11-21
  • 打赏
  • 举报
回复
我通常还是写代码copy attribute,封装到action的一个私有方法里,专门作mapping。

1。因为有些时候actionForm里的东西是和VO的属性不是简单的一一对应的
比如actionForm里的输入文本,如果你要做过滤去掉特殊字符(HTML标签,恶意js代码)然后才能放到VO内
再比如,后台DAO出来的一个VO包含一个日期属性expire_date,你需要在叶面同时显示中英文两种格式,你的actionForm可能需要对映出expire_date_cn和expire_date_en两个String属性(当然,你也可以一个属性在叶面上格式化两次)。

2。从分层角度看,actionForm属于叶面到action之间提交回馈输入的,不应该传到action之后的层次,那些validation方法之类的旨在叶面和action内有意义。
nighthawk 2005-11-21
  • 打赏
  • 举报
回复
我个人的做法是,1,如果业务逻辑并不复杂,你说的PO其实与form的字段基本一致,这种情况下,我会用form直接取代PO,那么返回的业务数据可直接放在form当中。另外你那个list也是多余的(你也不用再new一个form了,而且你那个list必须手动往request里面放)。只需在form里加上ArrayList。业务数据返回的时候直接将得到的list放入,比如:form.setYourList(allList);用action当中已经给你form。2,如果PO有存在的价值,那么,如你所提:搞一个BeanUtils.copyProperties(mobileInfoform, po)的方法,注意,以前方法的attribute是po。将po与mobileInfoform作一个映射。其他的情况参考1。

还有一种方式我自己也没想清楚。有待高手指正。暂且说出来以求证实:那就是提供一个接口给form与PO,用接口来说话。不知道这样是否方便。

action当中最好只是存在异常处理,信息提示,页面转发等。
qingzhuang 2005-11-21
  • 打赏
  • 举报
回复
我想以上的方法是可以封装一下作为一个工作的方法调用,都写在Action难看
qingzhuang 2005-11-21
  • 打赏
  • 举报
回复
在Action 我是这样写的,其中allList是返回的集合类
List list = new ArrayList();
try {
Iterator iterator = allList.iterator();
while (iterator.hasNext()) {
Object attribute = (Object) iterator.next();
MobileInfoForm mobileInfoform=new MobileInfoForm();
BeanUtils.copyProperties(mobileInfoform, attribute);
list.add(mobileInfoform);
}
} catch (Exception ex) {
}
nighthawk 2005-11-21
  • 打赏
  • 举报
回复
说实话,我不是很明白你的意思。
qingzhuang 2005-11-20
  • 打赏
  • 举报
回复
自己up一下

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧