结合struts和hibernate谈J2EE架构的数据表示 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
在 struts+ hibernate 不管他是Iterator,还是Li
|
这种结构中,是不应该把Hiber st,这是一个设计错误。
|
nate产生的PO直接传递给JSP的,
|
Web层的数据表示是FormBean,数据来源于HTML Form POST |
持久层的数据表示是PO,其数据来源于数据库,持久层的数据表示例如CMP |
在一个规范的J2EE架构 ,这样可以降低层间的耦合 辑进行了修改,那么只需要 同样滴,当数据库表进行了 层代码和Web层代码。
|
中,不同层的数据表示应该被限 性,提高J2EE架构整体的可维护 修改FormBean的结构,而不需要 小的调整,那么也只需要修改持
|
制在层内,而不应该扩散到其它层 性和可扩展性。比如说Web层的逻 触动业务层和持久层的代码修改。 久层数据表示,而不需要触动业务
|
不过由于Hibernate的 得在应用了Hibernate的J2E 为PO。
|
强大功能,例如动态生成PO,PO E框架中,PO完全可以充当VO,
|
的状态管理可以脱离Session,使 因此我们下面把PO和VO合并,统称
|
先来谈谈ActionFormBean和持久层的PO之间的重大区别。 |
在简单的应用中,ActionFormBean和 ActionFormBean来充当PO,于是ActionFo 穿过持久层,最后一直映射到数据库表。
|
PO几乎是没有区别,所以很多人干脆就是用 rmBean从JSP页面到Servlet控制层再到业务层,然后 真是一竿子捅到了底!
|
但是在复杂的应用中,ActionFormBe ActionFormBean是和网页里面的Form表单 么属性。而PO和数据库表对应,因此如果 程和数据库表字段对应关系不一致,那么
|
an和PO是分离的,他们也不可能一样。 一一对应的,Form里面有什么元素,Bean里面就有什 数据库表不修改,那么PO也不会修改,如果页面的流 你又如何能够使用ActionFormBean来取代PO呢?
|
比如说吧,用户注册页 属性,于是你需要一个Acti 一个文本框或者选择框什么
|
面要求注册用户的基本信息,因 onFormBean来一一对应(注意: 的。
|
此HTML Form里面包含了基本信息 是一一对应),每个Bean属性对应
|
而用户这个持久对象呢?他的属性和 ActionFormBean所没有的集合属性,比如 。另外还有可能的是在ActionFormBean里 Name, Last Name,而在我的User这个持
|
ActionFormBean有什么明显不同呢?他会有一些 说用户的权限属性,用户的组属性,用户的帖子等等 面有3个属性,分别是用户的First Name, Middle 久对象中就是一个 Name 对象属性。
|
假设我的注册页面原来 我要你提供全名,你要改Ac 为数据库没有改。
|
只要你提供First Name,那么Ac tionFormBean,加两个属性。但
|
tionFormBean就这一个属性,后来 是这个时候PO是不应该修改滴,因
|
那么在一个完整的J2EE系统中应该如何进行合理的设计呢? |
JSP(View) ---> ActionFormBean(Module) ---> Action(Control) |
ActionFormBean是Web 发生改变,它就要相应的进 修改,会一直牵连到业务层 性而言,是一个灾难,Acti
|
层的数据表示,它和HTML页面Fo 行修改,它不应该也不能被传递 和持久层的大面积的代码进行修 ont就是他的边界,到此为止!
|
rm对应,只要Web页面的操作流程 到业务层和持久层,否则一旦页面 改,对于软件的可维护性和可扩展
|
Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB |
而PO则是业务层和持久 能被传递到Web层的View中
|
层的数据表示,它在业务层和持 去,而ActionServlet就是他的
|
久层之间进行流动,他不应该也不 边界,到此为止!
|
当用户通过浏览器访问网页,提交了 FormBean属性读出来,然后构造一个PO对 向到成功页面。而业务层Bean收到这个PO 化操作。
|
一个页面。于是Action拿到了这个FormBean,他会把 象,再调用业务层的Bean类,完成了注册操作,重定 对象之后,调用DAO接口方法,进行持久对象的持久
|
当用户查询某个会员的信息的时候, UserNameFormBean包括了3个属性,分别 Action把UserNameFormBean的3个属性读 传递给业务Bean,进行查询。
|
他用全名进行查询,于是Action得到一个 是first name, middle name, last name,然后 出来,构造Name对象,再调用业务Bean,把Name对象
|
业务Bean取得Name(注 个User的PO对象,注意这个 然后业务Bean把User对象返
|
意: Name对象只是User的一个属 User不同于在Web层使用的UserF 回给Action。
|
性)对象之后调用DAO接口,返回一 ormBean,他有很多集合属性滴。
|
Action拿到User之后, UserFormBean,然后把User 面。
|
把User的基本属性取出(集合属 FormBean request.setAttribut
|
性如果不需要就免了),构造 e(...),然后重定向到查询结果页
|
查询页面拿到request对象里面的Act
|
ionFormBean,自动调用tag显示之。
|
FormBean是Web层的数 情况下,例如Hibernate中 务层内使用,最多到达Web
|
据表示,他不能被传递到业务层 ,他可以取代VO出现在业务层, 层的Control,绝不能被扩散到V
|
;PO是持久层的数据表示,在特定 但是不管PO还是VO都必须限制在业 iew去。
|
FormBean和PO之间的数据转化是在Action中进行滴。 |
|
|
|
|
|