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

Struts+Hibernate数据表示中的错误

阅读更多

  在 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中进行滴。

分享到:
评论

相关推荐

    struts+hibernate整合jar包

    Struts和Hibernate是两个在Java Web开发中广泛使用的开源框架。Struts主要负责MVC(Model-View-Controller)架构的实现,提供控制层的功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作...

    基于struts+hibernate+spring的用户管理系统

    例如,Spring可以注入Hibernate的SessionFactory到Struts的Action中,使得Action在处理请求时能够直接调用Hibernate进行数据操作。此外,Spring还提供了事务管理,确保数据操作的原子性和一致性。 登录功能是用户...

    struts+spring+hibernate实现图书修改和删除

    在IT行业中,SSH(Struts + Spring + Hibernate)是一个经典的Java Web开发框架组合,用于构建高效、可扩展的Web应用程序。本项目通过SSH框架实现了图书管理系统的图书修改和删除功能,下面将详细介绍这三个核心组件...

    Struts+Hibernate+Ajax注册示例

    Struts、Hibernate和Ajax是Java Web开发中的三个关键框架,它们各自解决不同的问题,并且可以协同工作以构建高效、功能丰富的应用程序。在这个“Struts+Hibernate+Ajax注册示例”中,我们将深入探讨这三个技术如何...

    Struts+hibernate+spring学习实例

    Struts、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责不同的职责,组合使用能够构建出高效、灵活的企业级应用程序。本实例旨在帮助初学者和J2EE开发者更好地理解和运用这三个框架的集成。 Struts是...

    Spring+struts+hibernate经典注册

    Spring、Struts和Hibernate是Java开发中的三大框架,它们各自负责不同的职责,组合起来可以构建出功能强大且架构清晰的企业级应用。在这个“Spring+Struts+Hibernate经典注册”项目中,我们将深入探讨这三个框架如何...

    struts+Hibernate+MySQL简单的增删改查例子

    Struts、Hibernate和MySQL是Java Web开发中常用的三个技术组件,它们共同构成了一个强大的后端数据处理系统。在这个“struts+Hibernate+MySQL简单的增删改查例子”中,我们将探讨如何利用这些技术来实现一个基本的...

    struts+hibernate做的分页显示

    在这个项目中,"struts+hibernate做的分页显示"主要是利用这两者来实现数据的分页展示,提升用户体验,降低服务器压力。 首先,Struts是一个基于MVC设计模式的Java Web框架,它简化了开发过程,提供了处理HTTP请求...

    ssh(struts+spring+hibernate)教务管理信息系统(全部代码) 可以直接运行

    在SSH系统中,Hibernate负责数据持久化,通过HQL(Hibernate Query Language)或SQL进行查询。实体类映射XML文件(hibernate.cfg.xml和.hbm.xml)定义了数据库表与Java类的对应关系,使得开发者可以无需关注底层的...

    Struts+Spring+Hibernate开发实例.pdf

    标题和描述中指出的文档《Struts+Spring+Hibernate开发实例.pdf》包含了关于这三个流行的Java开源框架结合使用的示例代码和相关知识点。Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责...

    Struts+hibernate图片上传

    Struts和Hibernate是Java Web开发中的两个重要框架,它们在构建动态网站时起着关键作用。Struts提供了MVC(模型-视图-控制器)架构,而Hibernate则是一个对象关系映射(ORM)工具,用于简化数据库操作。在这个...

    简易教学管理系统(jsp+spring+struts+hibernate+mysql)

    在教学管理系统中,Hibernate负责将教学数据(如学生、教师、课程等)映射为Java对象,通过ORM(Object-Relational Mapping)机制进行存储和检索,避免了直接编写SQL语句的繁琐工作。 MySQL是一个广泛使用的开源...

    网上书城系统(Struts+Hibernate+Mysql).rar

    本系统采用的技术栈是Struts、Hibernate和MySQL,这三者都是Java开发中的关键组件,各自扮演着不可或缺的角色。 Struts,是Apache软件基金会的一个开源项目,是一个基于MVC(Model-View-Controller)设计模式的Web...

    struts+hibernate文件上传

    Struts和Hibernate是Java Web开发中的两个重要框架。Struts主要负责MVC(Model-View-Controller)架构的实现,而Hibernate则是一个对象关系映射(ORM)工具,用于简化数据库操作。在这个“struts+hibernate文件上传...

    Struts+Hibernate实现用户登录案例

    在Java Web开发中,"Struts+Hibernate实现用户登录案例"是一个常见的应用场景,它结合了两个重要的技术框架:Struts和Hibernate。Struts是MVC(Model-View-Controller)设计模式的一种实现,用于处理用户的请求和...

    struts+hibernate登陆注册实例

    在"身份登录注册"实例中,Struts2 负责接收用户输入、校验数据、调用Hibernate操作数据库,而Hibernate则处理数据的持久化。具体步骤可能如下: 1. 用户填写用户名和密码,点击登录按钮,发送请求到服务器。 2. ...

    struts2+hibernate+mysql实现注册登录

    Struts2、Hibernate和MySQL是Java Web开发中的三个重要组件,它们共同构成了一个完整的MVC(Model-View-Controller)架构。在这个项目中,“struts2+hibernate+mysql实现注册登录”是一个基础的实战教程,旨在帮助...

    基于struts+hibernate的模拟银行转账

    在这个模拟项目中,虽然可能并未涵盖所有这些高级特性,但通过Struts1和Hibernate的整合,可以学习到如何在实际的Web环境中实现用户交互、数据库操作以及错误处理,为构建更复杂的网上银行系统打下基础。 在EBank...

    Spring+Struts+Hibernate比较详细的整合配置方案

    Spring、Struts和Hibernate是Java Web开发中三大核心框架,它们各自负责不同的职责:Spring作为依赖注入容器和面向切面编程(AOP)框架,提供应用的结构和事务管理;Struts是MVC(模型-视图-控制器)框架,负责处理...

    Struts+Hibernate电子留言系统

    Struts和Hibernate是两种在Java Web开发中广泛使用的开源框架,它们分别负责表现层和持久层的管理。Struts作为MVC(Model-View-Controller)架构的一部分,主要用于控制应用程序的流程,而Hibernate则是一个对象关系...

Global site tag (gtag.js) - Google Analytics