`
flash7783
  • 浏览: 308626 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

结合struts和hibernate谈J2EE架构的数据表示(作者:robbin)

    博客分类:
  • mvc
阅读更多

struts+ hibernate 这种结构中,是不应该把Hibernate产生的PO直接传递给JSP的,不管他是Iterator,还是List,这是一个设计错误。

我来谈谈在J2EE架构中各层的数据表示方法:


Web
层的数据表示是FormBean,数据来源于
HTML Form POST
业务层的数据表示是
VO
持久层的数据表示是PO,其数据来源于数据库,持久层的数据表示例如
CMP

在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,这样可以降低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。比如说Web层的逻辑进行了修改,那么只需要修改FormBean的结构,而不需要触动业务层和持久层的代码修改。同样滴,当数据库表进行了小的调整,那么也只需要修改持久层数据表示,而不需要触动业务层代码和Web层代码。


不过由于Hibernate的强大功能,例如动态生成POPO的状态管理可以脱离Session,使得在应用了HibernateJ2EE框架中,PO完全可以充当VO,因此我们下面把POVO合并,统称为PO


先来谈谈ActionFormBean和持久层的PO之间的重大区别。


在简单的应用中,ActionFormBeanPO几乎是没有区别,所以很多人干脆就是用ActionFormBean来充当PO,于是ActionFormBeanJSP页面到Servlet控制层再到业务层,然后穿过持久层,最后一直映射到数据库表。真是一竿子捅到了底!


但是在复杂的应用中,ActionFormBeanPO是分离的,他们也不可能一样。ActionFormBean是和网页里面的Form表单一一对应的,Form里面有什么元素,Bean里面就有什么属性。而PO和数据库表对应,因此如果数据库表不修改,那么PO也不会修改,如果页面的流程和数据库表字段对应关系不一致,那么你又如何能够使用ActionFormBean来取代PO呢?


比如说吧,用户注册页面要求注册用户的基本信息,因此HTML Form里面包含了基本信息属性,于是你需要一个ActionFormBean来一一对应(注意:是一一对应),每个Bean属性对应一个文本框或者选择框什么的。


而用户这个持久对象呢?他的属性和ActionFormBean有什么明显不同呢?他会有一些ActionFormBean所没有的集合属性,比如说用户的权限属性,用户的组属性,用户的帖子等等。另外还有可能的是在ActionFormBean里面有3个属性,分别是用户的First Name, Middle Name, Last Name,而在我的User这个持久对象中就是一个 Name 对象属性。


假设我的注册页面原来只要你提供First Name,那么ActionFormBean就这一个属性,后来我要你提供全名,你要改ActionFormBean,加两个属性。但是这个时候PO是不应该修改滴,因为数据库没有改。


那么在一个完整的J2EE系统中应该如何进行合理的设计呢?


JSP(View) ---> ActionFormBean(Module) ---> Action(Control)

ActionFormBean
Web层的数据表示,它和HTML页面Form对应,只要Web页面的操作流程发生改变,它就要相应的进行修改,它不应该也不能被传递到业务层和持久层,否则一旦页面修改,会一直牵连到业务层和持久层的大面积的代码进行修改,对于软件的可维护性和可扩展性而言,是一个灾难,Actiont就是他的边界,到此为止!


Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB

PO则是业务层和持久层的数据表示,它在业务层和持久层之间进行流动,他不应该也不能被传递到Web层的View中去,而ActionServlet就是他的边界,到此为止!


然后来看一看整个架构的流程:


当用户通过浏览器访问网页,提交了一个页面。于是Action拿到了这个FormBean,他会把FormBean属性读出来,然后构造一个PO对象,再调用业务层的Bean类,完成了注册操作,重定向到成功页面。而业务层Bean收到这个PO对象之后,调用DAO接口方法,进行持久对象的持久化操作。


当用户查询某个会员的信息的时候,他用全名进行查询,于是Action得到一个UserNameFormBean包括了3个属性,分别是first name, middle name, last name,然后ActionUserNameFormBean3个属性读出来,构造Name对象,再调用业务Bean,把Name对象传递给业务Bean,进行查询。


业务Bean取得Name(注意: Name对象只是User的一个属性)对象之后调用DAO接口,返回一个UserPO对象,注意这个User不同于在Web层使用的UserFormBean,他有很多集合属性滴。然后业务BeanUser对象返回给Action


Action
拿到User之后,把User的基本属性取出(集合属性如果不需要就免了),构造UserFormBean,然后把UserFormBean  request.setAttribute(...),然后重定向到查询结果页面。


查询页面拿到request对象里面的ActionFormBean,自动调用tag显示之。


总结:


FormBean
Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control,绝不能被扩散到View去。


FormBean
PO之间的数据转化是在Action中进行滴。


BTW:

JDO1.x
还不能像Hibernate功能这样强大,PO不能脱离持久层,所以必须在业务层使用VO,因此必须在业务层进行大量的VOPO的转化操作,相对于Hibernate来说,编程比较烦琐。


当然咯,理论是一回事,实际操作也不一定非要这样干,你可以自行取舍,在实际项目中灵活一点,增加一点bad smell,提高开发效率。只不过在大型项目中最好还是严丝合缝,不然的话,改版的时候会痛苦的很滴。

分享到:
评论
1 楼 chenzhiguo14 2009-09-19  
建议你了解下struts2,VO?什么年代的事情了?......

相关推荐

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理.pdf

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。《Struts2技术内幕:深入...

    Struts2技术内幕:深入解析Struts架构设计与实现原理

    资源名称:Struts2技术内幕:深入解析Struts架构设计与实现原理内容简介:本书由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。...

    Struts2 技术内幕-深入解析Struts2架构设计与实现原理

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。《Struts2技术内幕:深入...

    struts2 技术内幕——深入解析struts2架构设计

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。  本书以Struts2的...

    struts2技术内幕+struts2权威指南

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》由国内极为资深的Struts2技术专家(网名:downpour)亲自执笔,iteye兼CSDN产品总监范凯(网名:robbin)以及51CTO等技术社区鼎力推荐。《Struts2技术内幕:深入...

    Struts2技术内幕.pdf

     本书以Struts2的源代码为依托,通过对Struts2的源代码的全面剖析深入探讨了Struts2的架构设计、实现原理、设计理念与设计哲学,对从宏观上和微观上去了解Struts2的技术内幕提供了大量真知灼见。同样重要的是,本书...

    范凯个人网站源码robbin_site.zip

    robbin_site 是范凯的个人网站 http://robbinfan.com 网站的源码。 标签:robbin

    Struts2学习资料(强烈推荐)

    3. **Ajax支持**:Struts2可以与jQuery等库结合,实现异步更新和交互,提升用户体验。 4. ** strut2与其它技术集成**:例如,与Hibernate或MyBatis的持久层集成,以及与Spring框架的深度整合,实现服务层和DAO层的...

    开发高效率的J2EE企业应用.ppt

    在《开发高效率的J2EE企业应用》的分享中,作者Robbin(来自JavaEye.com)分享了他的调优经历,揭示了J2EE应用中常见的效率问题及其解决方案。 首先,EJB事务配置是关键。不当的配置可能导致事务处理效率低下,例如...

    MFC SDI制作Office2007样式的Robbin菜单.docx

    ### MFC SDI 制作 Office 2007 样式 Robbin 菜单 #### 一、概述 Microsoft Foundation Classes (MFC) 是一个由微软开发的类库,用于简化 Windows 应用程序的开发过程。本文档旨在介绍如何在 MFC 单文档界面...

    Robbin Fan—运营专业型社区的经验和反思.ppt

    Robbin Fan—运营专业型社区的经验和反思.ppt

    javaeye Robbin 论缓存技术

    在Javaeye Robbin的讨论中,他提到了缓存技术在多种场景下的应用和重要性。 **缓存的作用** 1. **高速缓冲存储**:缓存是一种位于主存储器和慢速I/O设备之间的高速存储器,其目的是减少对慢速设备的访问次数,提高...

    robbin谈管理:我敬佩的3位CEO管理者

    我从韦尔奇的书中学到了很多宝贵的管理知识,当然韦尔奇早已经成为显学,没必要多费口舌,所以只想提几点自己的感想:韦尔奇任内做了上千次公司并购和分拆,在韦尔奇自传当中看到很多次大型并购,韦尔奇的整个决策...

    Git常用命令备忘 - robbin的自言自语1

    Git是分布式版本控制系统,用于跟踪对文件和项目代码的更改。在本文中,我们将深入探讨Git的一些常用命令,这些命令对于日常开发和协作至关重要。 首先,配置Git是使用它的第一步。通过`git config`命令,我们可以...

    spring cloud 组件整合 eureka gateway feign hystrix,各个模的整合,供大家一起学习

    在Spring Cloud生态系统中,Eureka、Gateway、Feign和Hystrix是四个核心组件,它们协同工作以构建出高可用、高性能的微服务架构。让我们深入探讨这些组件以及它们如何整合。 1. **Eureka**:Eureka是Spring Cloud中...

Global site tag (gtag.js) - Google Analytics