java

位置:IT落伍者 >> java >> 浏览文章

Java进阶:结合Struts和Hibernate 谈J2EE数据表示


发布日期:2022年10月13日
 
Java进阶:结合Struts和Hibernate 谈J2EE数据表示

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

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

Web层的数据表示是FormBean数据来源于HTML Form POST

业务层的数据表示是VO

持久层的数据表示是PO其数据来源于数据库持久层的数据表示例如CMP

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

不过由于Hibernate的强大功能例如动态生成POPO的状态管理可以脱离Session使得在应用了Hibernate的JEE框架中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里面有个属性分别是用户的First Name Middle Name Last Name而在我的User这个持久对象中就是一个 Name 对象属性

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

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

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包括了个属性分别是first name middle name last name然后Action把UserNameFormBean的个属性读出来构造Name对象再调用业务Bean把Name对象传递给业务Bean进行查询

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

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

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

总结

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

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

BTW:

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

上一篇:Eclipse无法自动编译出class文件

下一篇:Spring2 提供的remote包学习笔记[3]