`
vv_1024
  • 浏览: 111653 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

再论 SSH 应用中 的 PO 与 VO

    博客分类:
  • J2EE
阅读更多
    在目前主流的轻量级框架SSH中,如果符合JPA规范,那就先设计PO模型,再生成数据库。
    PO(persistant object 持久对象)对象模型反映了对象间的关系,如一对多、多对多、单向双向访问关系等。可以看成是与数据库中的表相映射的java对象。

    VO(value object 值对象) 通常用于业务层之间的数据传递,在WEB应用中,一般用于和前台页面做数据相互。

    Struts1.x被2.x代替后VO层消失了,在action中直接传递PO,这样代码显得很简洁,很多SSH应用也都这样做。

    在简单的ssh中,po可以像下面这样:
@SuppressWarnings("serial")
@Entity
public class EmpInfo implements java.io.Serializable {
private Integer id;
private String empNo;
private WorkType workType;
private Set<WorkExperience> workExperiences = new HashSet<WorkExperience>(0);

//下面是get set 方法
}



    但随着系统框架的横向扩展,加入了如webservice、json、报表等功能后,问题也随之而来。

    如果 webservice 使用了 xfire,hibernate一对多关系又是lazy的话,那么必须在PO中对应的set上打上忽略注解,如:
@IgnoreProperty
public Set<WorkExperience> getWorkExperiences() {
	return workExperiences;
}

否则xfire解析容易进入死循环。

    在struts 2.1.6中使用json格式作为输出,也同样面临着上面的问题。PO对象中包含着复杂的关系,如果又是双向的,很容易出错,为了避免错误,我们又要在PO中打上相应的忽略注解,框架一多,各种注解参杂在PO中,显得很乱,最后都搞不清这些注解到底代表哪个功能。

    最后我又重新使用VO,原先PO中存在的一些字段也可以放入到VO中,如:age,PO可完全对应于数据库字段,而把一些需要和前台交互的字段放入VO中,如增加了age(可以根据身份证号计算出),VO中尽量存放简单数据类型,如上面PO中的WorkType(员工工种类型),在VO中就可以直接改成
private String workTypeName;

这样不管是前台使用什么系统(webservice和doNet C#交互,还是使用flex,ajax json等),转换为xml格式也异常简单,制作报表也不用过多的考虑如何解析传递过来的复杂对象和子表嵌套。用户关系的只是workType.name而不是WorkType这个类,VO由业务层产生,传递给视图层或其它各种接口。这样可以使得层次间进一步解耦,PO对象模型也变得容易维护(少了很多注解,代码清晰)。也使得前端数据结构的变得更轻(VO都是简单数据类型),有利于传输和解析。

    以上是我在最近学习中的总结,一般的应用SSH(jsp)action可以直接用hibernate 的 PO,不存在xml解析。


    补充:
    对于复杂对象转换为xml或json格式解析出错的问题,我已经遇到好多次,大家一起说说你们在项目中也遇到过吗?有什么好的解决方案?
2
1
分享到:
评论
1 楼 vv_1024 2009-12-03  
PO 与 VO 的关系是否可以看成类似数据库中的表和视图,以前两层架构的时候大量使用数据库的视图,而现在放到了对象模型中。

相关推荐

    SSH详细简介

    Action接受用户的数据,Action将数据从Action中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再forward。而业务层Bean收到这个PO对象之后,会调用DAO接口方法,进行持久化操作。 SSH框架是由...

    SSH架构下基于数据库的树状菜单的设计与实现.pdf

    本文主要讲解了 SSH 架构下基于数据库的树状菜单的设计与实现,涵盖了树状菜单的设计思想、PO 和 VO 的设计、Hibernate 映射文件的配置、Struts 控制器类的实现等方面。 一、树状菜单的设计思想 树状菜单是一种...

    ssh 架构描述

    3. Action从ActionFormBean中提取数据,创建业务对象(VO或PO),并调用Spring管理的Service接口。 4. Service层执行业务逻辑,可能包括调用DAO来完成数据库操作。 5. DAO通过Hibernate API与数据库交互,完成数据的...

    SSH(Spring+Struts+Hibernate)

    在SSH框架中,数据的流动过程通常是这样的:JSP页面上的表单数据提交到Action,Action从ActionFormBean中获取数据,封装成VO(Value Object,值对象)或PO(Persistent Object,持久对象),然后调用Service层的方法...

    SSH框架开发

    - Action类处理表单数据,封装成VO或PO对象,调用由Spring管理的Service层。 - Service层执行业务逻辑,可能涉及到DAO层操作。 - DAO层通过Hibernate与数据库交互,执行SQL语句。 - Service层处理完后,将结果返回给...

    SSH框架整合[总结].pdf

    在SSH框架整合中,数据流通常如下:用户在JSP页面上填写表单,数据通过ActionFormBean传递到Action,Action处理数据并创建VO(Value Object)或PO对象,然后调用Spring管理的Service。Service进一步调用DAO接口,DAO...

    SSH 项目框架搭建总结

    cn.itcast.elec.daomain:封装实体对象(PO对象),对应连接数据库表的映射文件 cn.itcast.elec.service:项目service层,负责操作各个功能模块的业务逻辑 cn.itcast.elec.util:封装系统使用到的公用类的方法和属性...

    Java项目使用小知识

    ` 这个方法用于将一个Bean对象的属性值复制到另一个Bean对象中,`po`和`vo`分别代表源Bean和目标Bean。 这两个方法在处理数据绑定或对象拷贝时非常有用,特别是在没有特定框架支持的情况下也能正常工作。 2. **...

    Java Web开发学习路线图(JBoss Seam方向)

    4. **DAO模式**:了解DAO(Data Access Object)模式,掌握DO、PO、VO、DTO、Domain Object等术语的含义。 #### 七、企业级应用开发 1. **EJB2**:探索Enterprise JavaBeans 2.0规范,包括EntityBean和SessionBean...

    程序员从初级到高级知识汇集

    除此之外,书中还涉及了如何自定义MyEclipse的编译目录,设置JAVA环境变量,以及PO、BO、VO、DTO、POJO、DAO的概念和它们在软件开发中的角色,这些都是Java开发中不可或缺的基础知识。 整体来看,这本书涵盖了从...

    浅谈Action+Service +Dao 功能

    数据的流向是:ActionFormBean接受用户的数据,Action将数据从ActionFormBean中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再Forward。 4. SSH框架的优点 Hibernate的最大好处就是根据数据库的...

Global site tag (gtag.js) - Google Analytics