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

struts和hibernate谈J2EE架构数据表示

阅读更多

    本文说明了在J2EE架构中各层的数据表示方法,包括:1、Web层的数据表示是FormBean;2、业务层的数据表示是VO;3、持久层的数据表示是PO。Form Bean不能被传递到业务层;PO在特定的情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control,绝不能被扩散到View去。

     

    在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架构的数据表示.doc

    本文将结合Struts和Hibernate两大框架,深入探讨在J2EE架构下不同层次的数据表示方法。 首先,Web层是用户交互的界面,其数据表示主要由FormBean承担。FormBean通常与HTML表单中的元素一一对应,负责收集用户输入的...

    浅谈基于Struts和Hibernate的J2EE应用

    基于Struts和Hibernate的J2EE应用,结合了MVC设计模式的灵活性和数据持久化的便利性,能够构建出高效、可维护的Web应用程序。开发者可以专注于业务逻辑的实现,而不必过于关注底层的控制流程和数据库操作。Struts的...

    DWR,Struts,Hibernate和Spring的J2EE架构开发大全

    基于Struts,Hibernate和Spring的J2EE架构研究.pdf 基于Struts,Spring,Hibernate架构的电信行业通信设施安全保障管理系统的实现.pdf 基于XML的JavaEE在企业级应用系统的研究与应用.pdf 基于“Struts+Spring+...

    J2EE架构数据表示:Struts+Hibernate

    在J2EE架构中,数据表示的层次分明是非常重要的,以确保系统具有良好的可维护性和可扩展性。这里我们主要讨论Struts和Hibernate结合时的数据流管理。 首先,Web层的数据表示是Form Bean,通常由HTML表单POST的数据...

    基于Struts,Hibernate和Spring的J2EE架构研究

    ### 基于Struts、Hibernate和Spring的J2EE架构研究 #### 一、引言 随着互联网技术的发展和企业需求的日益多样化,软件开发领域面临着越来越多的挑战。为了解决这些问题,J2EE(Java 2 Platform, Enterprise ...

    Struts+Hibernate简化J2EE的文件操作

    此外,Struts 1.2.4和Hibernate 3.0(RC1)分别用于Web层和数据持久化。虽然文章基于Windows平台,但这些技术在其他操作系统上同样适用。 在工程分析中,文章详细介绍了如何处理文件上传。存储上载文件的机制是通过...

    基于Struts和Hibernate框架的J2EE架构研究.pdf

    ### 基于Struts和Hibernate框架的J2EE架构研究 #### 1. 引言 随着互联网技术的发展和企业需求的不断增长,J2EE(Java 2 Platform Enterprise Edition)作为一套全面的企业级应用开发平台,在过去几年中得到了迅速...

    精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例全书

    网上购物子系统通常涉及商品浏览、购物车、订单处理等功能,需要处理复杂的业务逻辑和数据交互,是Struts和Hibernate应用的良好实践场景。公告管理系统则涉及到用户权限控制和信息发布的实时性,Spring的安全管理和...

    Struts_Hibernate和Spring的轻型J2EE架构的研究.pdf

    通常采用的表现层、业务逻辑层和数据访问层分别对应Struts、业务逻辑和Hibernate/Spring Data Access Layers。这样的分层可以提高系统的可扩展性和可维护性,同时也便于团队间的协作。 1. **表现层**:主要由Struts...

    开发者突击·Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)源码

    《开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)》详细介绍了Java Web软件架构中的各种开发技术。主要内容包括:以MySQL为数据库、Tomcat为Web服务器、Eclipse为开发工具、CVS为版本控制工具...

    J2EE Spring+Struts+Hibernate架构设计

    这样,业务逻辑、表示层和数据存储三者之间得到了良好的解耦,提高了代码的可维护性和可测试性。 **SSH架构的优势** 1. **模块化**:SSH架构将应用程序分为独立的模块,便于团队分工协作。 2. **可重用性**:各个...

    Struts2,Hibernate J2EE 邮箱系统源码

    项目需求文档可能详细描述了系统的需求分析、功能设计和接口规范,帮助开发者理解项目的整体架构和具体任务。 总之,这个邮局系统源码是一个典型的Java Web应用示例,展示了Struts2、Hibernate、J2EE以及Mysql的...

    基于Struts+Hibernate销售系统

    这里我们要探讨的是一款基于J2EE平台的销售系统,该系统充分利用了Struts和Hibernate两大框架的优势,实现了从前台数据展示到后台管理的全面功能。下面,我们将深入解析这款系统的架构和实现机制。 首先,Struts是...

    J2EE-Struts-Hibernate

    这样,业务逻辑层和数据访问层的耦合度降低,提高了代码的复用性和可测试性。 在实际项目中,"www.pudn.com.txt"可能是一个包含教程链接、示例代码或者讨论论坛的文本文件,而"源代码"则可能包含了使用Struts和...

    Struts开发指南之J2EE n层结构.doc

    Struts框架虽然不直接涉及业务逻辑的实现,但它为业务逻辑的调用和数据的流转提供了便利。 #### 4. 数据访问层(Data Access Layer) 数据访问层负责与底层数据存储系统(如数据库)的交互,实现数据的持久化和...

    意见墙基于Struts+Hibernate实现,J2EE项目

    它利用了Struts作为MVC架构的控制器,Hibernate作为ORM工具处理数据,基于J2EE平台提供服务。系统的成功实施不仅依赖于技术实现,还依赖于对用户需求的理解和响应,以及良好的项目管理与迭代更新。

Global site tag (gtag.js) - Google Analytics