我的Blog我做主^_^
走向一条通往JAVA的不归路...
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
64 随笔 :: 68 文章 :: 77 评论 :: 0 Trackbacks
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(10)
给我留言
查看公开留言
查看私人留言
随笔分类
ibatis
(rss)
JAVA基础
(rss)
设计模式(1)
(rss)
随笔档案
2011年5月 (4)
2010年12月 (1)
2010年10月 (1)
2010年6月 (1)
2009年3月 (1)
2009年1月 (1)
2008年12月 (1)
2008年10月 (2)
2008年9月 (1)
2008年7月 (1)
2008年6月 (2)
2008年5月 (2)
2008年4月 (1)
2008年3月 (1)
2007年11月 (5)
2007年9月 (1)
2007年6月 (1)
2007年5月 (5)
2007年4月 (5)
2007年3月 (8)
2007年2月 (7)
2007年1月 (11)
2006年12月 (1)
文章分类
Android(2)
(rss)
HIBERNATE(6)
(rss)
ibatis(1)
(rss)
JAVA(8)
(rss)
JAVASCRIPT(11)
(rss)
LINUX(4)
(rss)
OPEN SOURCE(11)
(rss)
SPRING(2)
(rss)
STRUTS(9)
(rss)
心情驿站(1)
(rss)
数据库(6)
(rss)
服务器(2)
(rss)
设计模式(3)
(rss)
新闻分类
News
(rss)
收藏夹
经典URL(21)
(rss)
友情
beansoft
freebird
oksonic博客
SteelHand
Struts2----max
wolfsquare
刑红瑞的BLOG
张利海的BLOG
张立军博客
江南白衣博客
铁手剑谱
韩再芬
最新随笔
1. org.apache.taglibs.standard.tlv.JstlCoreTLV
2. String.format 格式化
3. SDL_app:emulator.exe应用程序错误
4. Tomcat部署时报错Deployment failure on Tomcat 6.x. Could not copy all resources to
5. Eclipse插件 Subclipse 去掉或者修改 记住的用户名密码
6. struts2 标签
7. 分隔数据库表
8. Spring的JDBCTemplate
9. JProfiler的配置问题
10. js判断浏览器是否关闭
搜索
积分与排名
积分 - 215096
排名 - 262
最新评论
1. re: 纯JS长文章分页代码
评论内容较长,点击标题查看
--suchso.com
2. re: js判断浏览器是否关闭
op;
--op
3. re: Spring的JDBCTemplate
评论内容较长,点击标题查看
--zuidaima
4. re: Spring的JDBCTemplate
评论内容较长,点击标题查看
--zuidaima
5. re: 程序员是有前途的。。。
程序员的未来之路还可以做讲师。
--赵利文
阅读排行榜
1. Spring的JDBCTemplate(58110)
2. Spring学习笔记----MultiActionController (8901)
3. js判断浏览器是否关闭(7853)
4. 数据库置疑解决方案(7737)
5. 动态JSP页生成静态HTML(5921)
评论排行榜
1. 动态JSP页生成静态HTML(23)
2. Tomcat:IOException while loading persisted sessions: java.io.EOFException解决手记(9)
3. SDL_app:emulator.exe应用程序错误(4)
4. IP地址段的过滤(4)
5. 强行关闭8080端口(3)
结合struts和hibernate谈J2EE架构的数据表示[转载]
在 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) - 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包括了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显示之。
总结:
FormBean是Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control,绝不能被扩散到View去。
FormBean和PO之间的数据转化是在Action中进行滴。
BTW:
JDO1.x还不能像Hibernate功能这样强大,PO不能脱离持久层,所以必须在业务层使用VO,因此必须在业务层进行大量的VO和PO的转化操作,相对于Hibernate来说,编程比较烦琐。
当然咯,理论是一回事,实际操作也不一定非要这样干,你可以自行取舍,在实际项目中灵活一点,增加一点bad smell,提高开发效率。只不过在大型项目中最好还是严丝合缝,不然的话,改版的时候会痛苦的很滴。
posted on 2007-01-06 10:06
java_蝈蝈
阅读(235)
评论(0)
编辑
收藏
所属分类:
STRUTS
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
jstl与struts结合
用Struts的Token机制解决表单重复提交
Struts-Bean 标签库 [转载]
用Validator检查你的表单
JSTL与Struts的结合(十)[转载]
第9章 Struts与表现层技术的结合[转载]
Struts-Logic 标签库[转载]
结合struts和hibernate谈J2EE架构的数据表示[转载]
struts-Html 标签库[转载]
Powered by:
BlogJava
Copyright © java_蝈蝈