2005年10月27日

在 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 @ 2005-10-27 10:11 月夜的家 阅读(141) | 评论 (0)编辑 收藏

2005年10月16日

开幕了,全场黑灯瞎伙,音乐想起,气氛有些阴森恐怖

在跑道四周的演员个个穿得象OTMAN(奥特曼),手里牵着类似猪肝的巨大物体然后这些牵着猪肝的OTMAN聚集在舞台中央,像个至尊PIZZA,
突然,红光崩现~~
PIZZA又分裂成若干猪肝、上升~~宛如一朵蘑菇云,让我想起了今年是抗战60周年纪念

令人受不了的是烟雾,从没想到干冰会如此的令人窒息~~
小丹宁吐了,许多14排以前的人都跑了,敢于留下来的都用手帕捂着嘴,惨不忍睹,配合五颜六色的激光,殷曼婷说,“妈的,就像黑山老妖!”

表现江苏科技一章,除了OTMAN举着螺母、三角板乱跑,实在看不出有啥工业成份可言
孙老大发话:“想起了学好数理化,走遍天下”的古老格言
唉~导演的创意实在令江苏人蒙羞,表现科技用三角板,依此类推,表现表现江苏经济大省是不是该举着钞票满场跑?

最夸张的是800个古代的三陪女手抱着琵琶,

孙老大说,呵呵,有史以来最多的琵琶集会
我觉得这个糟糕的场景明显剽窃了张艺谋在雅典奥运会结尾那个最臭名昭著的大腿舞
在张艺谋眼里,
陕北风俗+大红棉袄+大腿+二胡+扭屁股+大红灯笼=中国
在我们导演眼里,
苏南小调+绿色长裙+露半个后脊背+琵琶+转圈+雨伞=江苏

摄像也很滥,根本抓不住演员,特写镜头也没几个(后评:哎)

但我还是喜欢这个开幕式(除了干冰令我作呕外),特别是第一章,倒不是因为它好,实在是因为它够烂。不过,虽然烂、恐怖、阴森,不知所云、不着边际、不以为耻反以为荣,但总比让我去看那些弘扬正气的,光明的,正气凛然的、充满正面说教的开幕式好。

因此开幕式还是值得一看的,当然要抱着幸灾乐祸的心态,抱着吃饱了撑的没事干的心态,就当是看百年不遇的猴儿打架!
posted @ 2005-10-16 15:06 月夜的家 阅读(323) | 评论 (0)编辑 收藏
 
且说孙悟空大闹天宫,观世音菩萨举荐二郎真君降妖,带天兵天将在花果山大战。正斗间,大圣忽见本营中妖猴惊散,自觉心慌,抽身就走,众天将慌慌张张,前后寻觅不见,一齐吆喝道:“走了这猴精也!走了这猴精也!”
  二郎神圆睁凤目观看,却见下界人烟繁华之处,那大圣变做一个老头,推着一辆三轮车,抖抖索索地,正在街边卖烤白薯。二郎心中冷笑,正待发标打他,忽然见一伙城管,手持锤剪棍棒,吆吆喝喝,不由分说,便将三轮车砸得稀烂。大圣一惊,以为是天兵到来,连忙转过街角,又摇身一变,变做一个小姐,描眉画眼,在那里袅袅婷婷走路。却又被二郎看个真切,二度意欲发标,迎面却又来了几个公安,劈面揪住大圣道:“定是一个野鸡,随我局子里走一趟!”大圣心慌,忙道:“我不是野鸡,我还是处女!”公安狂笑道:“处女怎地?处女便嫖不得娼么?”手铐一抖,便要拿人。大圣见事不谐,忙将腰一扭,腾空而去,眼见前方一个山凹,便滚下山崖,伏在那里又变,变一座小学,大张着口,似个校门,牙齿变做门扇,眼睛变做窗棂,抖几个猴虱下来变做学生咿咿呀呀念书。只有尾巴不好收拾,竖在后面,变做一根旗竿,悬起一条大标语:“百年大计,教育为本;义务教育,免费入学。”二郎两番被抢了先手,心中正在烦闷,眼看得这条标语,不由笑道:“是这猢狲了!他今又在那里哄我。殊不知中国号称义务教育,那里有得免费?我也曾见过学校千万,更不见一个不把学生做摇钱树的,看我打杀这个猴子!”大圣听得心惊,扑的一个虎跳,又冒在空中不见。
  真君望不见大圣踪影,急纵身驾云,起在半空。见那李天王高举望远镜站在云端,呵呵笑道:“真君,快去!快去!那猴使了个隐身法,走出营围,往你那灌江口去也。”二郎听说,忙回灌江口来赶。
却说灌江口正开大会,大圣摇身一变,变做一个XX代表,杂在会场之中,指东点西,做踊跃发言状。正自以为得计,却不料被真君一眼识破:“XX代表向来是泥塑土偶的神像,什么时候跑出一个活的来?”举着三尖两刃神锋,劈脸就砍。那猴王急忙躲过,使金箍棒相对。两个嚷嚷闹闹,打出会场,半雾半云,且行且战。
  半空中天庭妇联主任观音菩萨与炼丹部长太上老君正在观战。菩萨对老君道:“老君哥哥,贫僧所举二郎神如何?果有神通,已经那大圣围困,只是未得擒拿。我如今助他一功,拿下猴头。”老君道:“观音妹子?你将何兵器助他?”观音回身唤过坐骑:“看我开宝马撞他一下。”老君道:“你那宝马价格甚为昂贵,若撞坏了多有不便。”观音道:“横竖也是公款,撞了就撞了吧。”老君又道:“那修理起来也甚为麻烦,还是让我来替妹子助他吧。”观音曰:“坏了就不要了,我正想换辆凯迪拉客。”正拉拉扯扯间,老君身后转过一名仙娥,乃是有名的张惟英教授,献与老君一件宝物,嘴里喃喃说着什么 “总不能让所有人都来天庭吧……我至今都不认为我错了……”转身而去。老君定睛看时,那宝物却是一件“天庭人口准入制度”,不由大喜:“此物一出,全中国人都发抖,正可用来对付山野村猴,等我丢下去打他一下。观音妹子,这趟功劳要让给我了。”观音娇嗔道:“讨厌,人家不跟你玩了啦。”老君涎脸笑道:“妹子莫气,这一击若得手,定将此役拍做主旋律电影,妹子作为主角,由我家女丑女丑扮演,所有院线同时上映,何如?”观音这才回嗔作喜。
  只见老君将那法宝自天门上往下一掼,滴溜溜,可可的着猴王头上一下,将大圣打翻在地,众天庭公安一拥而上,将大圣捆个结实,再也不能变化。一公安怒道:“这厮令我等吃了不少苦头,今日一发还了他罢!饶你个孙悟空,今日要将你变做孙志刚!”正待把出手段,却有另一公安叫道:“且慢,我等老手段土得掉渣,如今时兴与国际接轨,那驻伊美军虐囚,手段千变万化,何不学得一二,今日做个新鲜耍子?”众公安一听,齐声称妙,便将大圣押去斩妖台,电击火烧,刀砍斧剁,却伤不得大圣分毫。
  玉帝见状,不由踌躇:“这厮这等,这等……如何处治?”老君奏道:“不若与老君领去,放在八卦炉中,炼出我的丹来,何如?”玉帝闻听大喜,便将大圣赐与老君锻炼。殊不知大圣神通广大,拔下一根毫毛,变做美钞,贿赂了扇火童子,得知那巽位下有风无火,前往躲避,未曾受得重伤。
  七七四十九日满,老君开炉取丹,却见大圣飞身而出,使金箍棒大杀四方,打得天宫中九曜星闭门闭户,四天王无影无踪。直打到通明殿前,玉帝见状大惊,忙叫道:“快,关门,放协警!”原来那协警之徒,比正规警察更凶恶十倍,只见一个个奋勇争先,踊跃咆哮,将大圣围在垓心,眼看就要拿下。
  玉帝正在庆幸,忽见协警们全做了鸟兽散,原来此辈性贪,眼中只有金银,大圣之黄金锁子甲在炉子中烤得甲环松脱,被众协警一口一撕,顷刻间个个嘴里有片黄金,纷纷跑回后院掩埋收藏不提。
  正没奈何间,忽见西方如来相助,要与大圣赌赛。如来曰:“我有一样法宝,你若能飞出我这法宝管辖,便让你做了玉帝之位;若飞不出,便缴械投降如何?”说罢自怀中掏出法宝,悟空定睛看时,却是一个小小本子,上书三个大字:暂住证。便笑道:“一个小小本子,有何灵能,我去也!”一个跟头飞出,自天空降落北京地界,脚步刚落,便见几名警察前来:“那个谁,说你呢!暂住证拿出来看看!”悟空一惊,将腰一扭,又一个跟头飞到广州,正在观望,忽见一群联防冲来:“这个好像没有暂住证,快抓住他!”七手八脚要拿下大圣,大圣忙分开众手,复又飞起,急切间难辨方向,却又飞回如来面前。如来微笑道:“我的宝贝何如?”大圣道:“不算!不算!闻听西方有国,不设暂住证,待我去来!”正要纵身跳出,却被如来手掌一翻,将暂住证变做一座五行山,将大圣牢牢压住。
  玉帝见擒了大圣,心中大喜,便邀请如来及有功群臣,备齐饭局麻将、赃款三陪,做了一个安天大会,盛世联欢。正行乐间,忽有五行山居委会老太来报:“那大圣伸出头来了,说他要挣脱出去赶招聘会,投简历发名片,谋个职位,以图东山再起哩!”如来道:“不妨,不妨。”袖中只取出一张帖子,上有六个金字:“此人农村户口。”递与手下,让贴在那五行山顶上。又向天再借五百年,使那帖子牢牢置顶不得脱落,那座山即生根合缝,大圣再也无法爬出,自此一压就是五百年不得翻身也。
posted @ 2005-10-16 14:45 月夜的家 阅读(244) | 评论 (0)编辑 收藏
仅列出标题