在struts+hibernate这种结构中,是不应该把Hibernate产生的PO直接传递给JSP的,不管他是Iterator,还是List,这是一个设计错误。
我来谈谈在J2EE架构中各层的数据表示方法:
◆Web层的数据表示是FormBean,数据来源于HTML Form POST
◆业务层的数据表示是VO
◆持久层的数据表示是PO,其数据来源于数据库,持久层的数据表示例如CMP
在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,这样可以降低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。比如说Web层的逻辑进行了修改,那么只需要修改FormBean的结构,而不需要触动业务层和持久层的代码修改。同样的,当数据库表进行了小的调整,那么也只需要修改持久层数据表示,而不需要触动业务层代码和Web层代码。
不过由于Hibernate的强大功能,例如动态生成PO,PO的状态管理可以脱离Session,使得在应用了Hibernate的J2EE框架中,PO完全可以充当VO,因此我们下面把PO和VO合并,统称为PO。
先来谈谈ActionFormBean和持久层的PO之间的重大区别:
在简单的应用中,ActionFormBean和PO几乎是没有区别,所以很多人干脆就是用ActionFormBean来充当PO,于是ActionFormBean从JSP页面到Servlet控制层再到业务层,然后穿过持久层,最后一直映射到数据库表。真是一竿子捅到了底!
但是在复杂的应用中,ActionFormBean和PO是分离的,他们也不可能一样。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) ---> Action Form Bean (Module) ---> Action(Control)
Action Form Bean是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,然后Action把UserNameFormBean的3个属性读出来,构造Name对象,再调用业务Bean,把Name对象传递给业务Bean,进行查询。
业务Bean取得Name(注意:Name对象只是User的一个属性)对象之后调用DAO接口,返回一个User的PO对象,注意这个User不同于在Web层使用的UserFormBean,他有很多集合属性的。然后业务Bean把User对象返回给Action。
Action拿到User之后,把User的基本属性取出(集合属性如果不需要就免了),构造UserFormBean,然后把UserFormBean request.setAttribute(...),然后重定向到查询结果页面。
查询页面拿到request对象里面的ActionFormBean,自动调用tag显示之。
总结:
Form Bean是Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control,绝不能被扩散到View去。
Form Bean和PO之间的数据转化是在Action中进行的。
BTW(顺便说一句):
JDO1.x还不能像Hibernate功能这样强大,PO不能脱离持久层,所以必须在业务层使用VO,因此必须在业务层进行大量的VO和PO的转化操作,相对于Hibernate来说,编程比较烦琐。
当然了,理论是一回事,实际操作也不一定非要这样干,你可以自行取舍,在实际项目中灵活一点,增加一点bad smell,提高开发效率。只不过在大型项目中最好还是严丝合缝,不然的话,改版的时候会痛苦的很的。
相关推荐
结合struts和hibernate谈J2EE架构的数据表示
基于J2EE平台的Struts框架技术已成为开发Web应用的主流技术,而Struts框架在模型部分的实现并不理想,采用JDBC来连接数据库存在复杂编程、层间高耦合和难以维护等问题,提出了Struts和Hibernate框架整合。应用ORM技术...
基于Struts和Hibernate和Spring的J2EE架构研究这是一个非常好的pdf文档一般是花钱也买不到的
基于Struts,Hibernate和Spring的J2EE架构研究.pdf 基于Struts,Spring,Hibernate架构的电信行业通信设施安全保障管理系统的实现.pdf 基于XML的JavaEE在企业级应用系统的研究与应用.pdf 基于“Struts+Spring+...
介绍Struts,Hibernate和Spring三个开源框架及它们对MVC设计模式的实现,阐述如何更好地将三者结合起来构建一个健壮、高效、易于扩展的J2EE分层架构,并给出该架构的结构图,分析它的优缺点,并且通过网上购物系统给出了...
讲述基于Struts和Hibernate框架的J2EE架构研究............
PO是持久层的数据表示,在特定情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control,绝不能被扩散到View去。JDO1.x还不能像Hibernate功能这样...
Struts_Hibernate和Spring的轻型J2EE架构的研究.pdf.........
《开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)》详细介绍了Java Web软件架构中的各种开发技术。主要内容包括:以MySQL为数据库、Tomcat为Web服务器、Eclipse为开发工具、CVS为版本控制工具...
ppt格式的讲义,以SSH流行架构为例详细讲解了J2EE架构设计。
J2EE企业应用实战:Struts Spring Hibernate 整合开发 分卷1 PDF 有书签 清晰 详尽而细致地介绍了JSP 各个方面,包括JSP 2.0 的规范、Struts的各种用法、Hibernate 的详细用法,以及Spring 的基本用法。书中所介绍的...
J2EE企业应用实战:Struts Spring Hibernate 整合开发 分卷2 PDF 有书签 清晰 详尽而细致地介绍了JSP 各个方面,包括JSP 2.0 的规范、Struts的各种用法、Hibernate 的详细用法,以及Spring 的基本用法。书中所介绍的...
基于Struts和Hibernate的在线考试系统,段朋鹏,郭庆平,在J2EE的B/S应用架构下,以Struts作为表示层框架,Hibernate作为数据持久层框架,设计一个MVC模式的在线考试系统。该系统运行效率高,具��
j2ee 架构设计 第一部份:介绍实例架构 结合实例讲解Web项目总体结构 分析多层结构优点 具体讲解每个层次的实现技巧 第二部分:介绍组织层次关联利器(Spring) 快速入门 Factory模式 IOC模式 AOP模式 演练Spring的...
12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...
12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...
《Struts Hibernate Spring集成开发宝典》以Struts,Hibernate,Spring为核心详细地讲解了这三个组件的基础知识和基本使用方法,并通过一系列集成开发实例讲解了这三个组件在J2EE项目中的应用。《Struts Hibernate ...
这个是我为大家开发的一个经典例子,实现用户注册和问候,具体看文档说明。
文章探讨了Spring+Struts+Hibernate轻量级的J2EE平台和技术,讨论了报备信息管理系统的功能和架构,探讨如何配置搭建Spring+Struts+Hibernate的J2EE框架开发和实现报备系统。
本文阐述了Struts 和Hibernate 框架技术,并通过分析这两种框架各自的优缺点,设计了整合Struts 和Hibernate 框架技术的J2EE 架构。并指出基于Struts 和Hibernate 框架的轻量级J2EE 架构必将成为开发企业级应用的...