﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-gbk</title><link>http://www.blogjava.net/gbk/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:10:54 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:10:54 GMT</pubDate><ttl>60</ttl><item><title>oracle是如何工作的--非常形象</title><link>http://www.blogjava.net/gbk/archive/2009/08/10/290545.html</link><dc:creator>百科</dc:creator><author>百科</author><pubDate>Mon, 10 Aug 2009 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/gbk/archive/2009/08/10/290545.html</guid><wfw:comment>http://www.blogjava.net/gbk/comments/290545.html</wfw:comment><comments>http://www.blogjava.net/gbk/archive/2009/08/10/290545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gbk/comments/commentRss/290545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gbk/services/trackbacks/290545.html</trackback:ping><description><![CDATA[一个名叫Sid的男人，狂热地爱好拍摄、保存和整理照片。Sid的妻子名叫Debbie，他们有三个儿子Logan、Archie和Chuck。他有一所很大的房子，同住的有男管家Simon和女仆Pam。我将介绍他的家庭、他的房子和他的爱好：拍摄、收集和炫耀他的照片。 <br />
现在，Sid快乐地生活着—家庭、朋友和假期。他不时地拍照。事实上，他总是随身带着相机。他不想错过任何东西。每一个早餐、午餐和晚宴，都会被拍下来。当孩子们从学校回家，镜头摄入他们对父亲的问候。当孩子们做家庭作业的时候，&#8220;卡嚓、卡嚓、卡嚓&#8221;，照相机的快门响个不停。棒球赛上，儿子Archie的每一个投掷都被拍摄下来。学校的舞会上，Chuck的父亲拍下了每一个缓慢的舞步以及在苏打水机器旁的交谈。而他的狗——Sadie则是这个世界上被拍摄次数最多的狗。 <br />
他和他的家庭收藏了数以百万计的照片。一些照片被销毁掉了，一些则经历了改变。Sid有一套神奇的系统来处理这些照片。让我来告诉你一些关于他的家庭、他的房子的事，以及关于他和他的家人如何致力于发展、组织和保护所有这些照片。 <br />
Sid用一架特殊的相机拍摄。他的相机每拍摄一次，就同时产生一张照片和一张底片。他从来不用换胶卷（这是一种科幻技术）。照片被贴在房间的墙壁上，而底片则被保存在一个安全的地方。 <br />
1.1.1 Sid的家 <br />
我介绍过Sid的家了吗？嗯。那里非常的大而且到处都是照片。因为照片实在是太多了，所以Sid必须寻找地方来放置它们。一些照片被挂在墙上，一些被藏在照相簿内，一些被插入剪贴簿里，一些被放在储藏室的一个盒子里再也不会被撇上一眼。所有这些照片都被放在他家中的某处。他称呼这些放置照片的地方为&#8220;相片空间&#8221;。一个相片空间可能是一个有着很多墙壁的房间，或者是有着很多页的剪贴簿。一个房间是照片的逻辑存储单元。房间内的墙壁则是相片空间中保存照片的物理结构。 <br />
1.1. 2 Debbie的家务事 <br />
因为Sid忙于拍摄和处理照片，他没有足够的精力来放置和储存它们—那是她妻子的工作。Debbie的全名是Debra Wrider。她的T恤衫上印着DBWR—这是一种家庭传统—为所有的东西做标签。 <br />
把所有这些照片放置得井井有条是一件巨大的工作，不过Sid和Debbie已经建立了一个系统。当Sid拍摄结束后，他把照片都放在厨房里一个特定的架子上。那个特定的架子被称为&#8220;DB_BUFFER_CACHE&#8221;。Debbie时常检查那个架子，看看上面是否有新拍摄的照片。在白天，她把从架子上取回的照片分别放置到对应的相片空间。事实上，在一场棒球赛或者学校的舞会上，Sid制作照片的速度太快了。以至于Debbie几乎跟不上。这是一个特别的情景，Sid拍摄照片，然后放置在那个特定的架子上，Debbie把这些照片放在剪贴簿里，挂在墙上或者插入照相簿内。 <br />
当Sid带着照片和底片进入厨房时，他和他妻子之间可能会有这样的一段对话： <br />
Sid：&#8220;亲爱的，猜猜我给你带回来了什么？&#8221; <br />
Debbie：&#8220;你又拍了很多照片，是吗？你知道我是多么喜欢整理照片啊。&#8221; <br />
Sid：&#8220;当然了，Archie的棒球队赢得了最后一局。他在第九局以两个二垒打获胜，我全部都拍摄下来了。&#8221; <br />
Debbie：&#8220;太好了，那些照片放在相片空间9号墙壁的运动类里，看上去一定棒极了。我已经等不及去放置它们了，我将邀请所有的邻居来观赏。&#8221; <br />
Sid：&#8220;Archie也非常高兴。OK，我再去拍一些照片，我将在23毫秒后回来。哦，顺便说一下，我刚才将那些照片放在DB_BUFFER_CACHE架子上。现在Sid的目录号为1332935。&#8221;Debbie：&#8220;知道了，再见。&#8221; <br />
为了易于管理照片、框架和日志，他使用一种特殊的数字来建立目录，称之为Sid的目录编号。他用这些独特的、不断递增的数字来追踪对这所房子内所有照片的操作。Sid和Debbie已经对查阅Sid的目录编号感到厌倦。Sid在所有的照片、录像带和底片上都写上&#8220;Sid的目录编号&#8221;，累得手要抽筋。最后，他们将&#8220;Sid的目录编号&#8221;缩略为SCN。记住SCN，Sid的生活都围绕着它展开。 <br />
现在，全家人都知道这个数字被简称为SCN。你可以在每一个地方都看到SCN。Sid把它们写在底片上，然后他把低位和高位的SCN写在每一包底片外面。Debbie把它们写在她放置照片的地方。这些数字在Sid的复杂家庭生活中显得尤为重要。 <br />
Debbie把照片放在框架里，房子里的每一个框架都是一样大小。一些框架只保存了一张照片，一些框架则保存了几张照片。一些特别大的照片则要占据多个框架。Sid有一张和原物同样大小的照片，拍摄的是他在跳伞后在空中做造型动作，这张照片占据了两个框架。当照片跨越框架时，Sid称之为照片链。 <br />
任何时候，只要Debbie改变框架内的照片，她就把照片的SCN写在框架上。房子内的每张照片都有一个惟一的数字。他们称照片的这个数字为照片ID。这些照片ID帮助Sid管理家中所有墙上的照片。如果他需要尽快找到一张照片，他通过照片ID来实现。通过照片ID，Sid能够迅速找到墙壁和保存照片的框架。 <br />
有时候，Sid会对照片进行一些改变。如果他要编辑一张照片，那么他让Debbie通过照片ID找到他的照片。Debbie给他一份包括所需照片的整个框架的拷贝。为防止Sid可能改变主意，不喜欢他已经做的一些改变，他把那份拷贝放在一个储藏室内，称之为&#8220;回退&#8221;储藏室。当Sid完成了更改并且确定了以后，Debbie把更改后的照片放回到墙壁上原先的地方，并且把新的SCN写在框架上。如果Sid不喜欢他的更改，他们就从&#8220;回退&#8221;储藏室里取出框架并且把它放回墙上。这样一来，照片就和Sid没有改动以前一样。 <br />
1.1.3 Logan的家务事 <br />
Debbie为了处理Sid的照片已经忙得焦头烂额，所以她没有足够的时间和精力来处理Sid的底片。Sid认为他的儿子们在玩电子游戏和吃土豆片上浪费了太多的时间，他决定给他们安排任务。 <br />
Sid的大儿子叫做Logan William Randolph。Logan的衬衫上都印着LGWR。Logan有一个非常简单但是非常重要的任务。Sid的相机产生照片的同时产生了底片，Logan的任务是将底片放入笔记本里。家中的厨房里竖着另一个架子，架子上Sid贴了一个标签，用来标记那些发送给大儿子的底片。标签被称为&#8220;LOG_BUFFER&#8221;，Logan坐在厨房的桌子旁，观察这个特殊的LOG_BUFFER架子。当有底片被放到这个架子上时，他立即把底片放在笔记本里。Sid称这些笔记本为&#8220;重做笔记本&#8221;。他使用这个名称是因为以后他可以用里面的底片重新制作一张照片。Logan检查他的架子的频率要比Debbie的高得多。Sid表示，只要有底片，他就可以随时重新制作一份照片。Logan和他父亲的对话简短而温馨： <br />
Sid：&#8220;Logan，底片在架子上了！&#8221; <br />
Logan：&#8220;知道了，我会立即处理的。&#8221; <br />
Logan按照他得到底片的顺序将这些底片放入&#8220;重做笔记本&#8221;。一旦当前的笔记本装满了底片，他就换另一个新的笔记本。每一次他更换&#8220;重做笔记本&#8221;后，都在&#8220;告警笔记本&#8221;上做一个记录，然后通知他的兄弟来进行他们的家务活。 <br />
悲哀，是不是？老爸和他的大儿子太专注于底片了！ <br />
顺便提到，不是所有的照片都有对应的底片保存。Sid指定某些照片不必被做日志，这些照片就没有对应的底片保存在&#8220;重做笔记本&#8221;里。Sid称其为&#8220;无日志&#8221;。 <br />
1.1.4 Archie的家务事 <br />
Sid的第二个儿子Archibald则另有任务。他的衬衫上写着ARCH。Archie从重做笔记本里提取底片后，把它们放置在一个安全的地方。 <br />
当Archie发现Logan更换到另一个重做笔记本的时候，他就开始行动。他拿起重做笔记本中的那些底片，把它们放在房子外面的一个安全地方。Sid在后院建造了一个控制好温湿的地下室。那是他保存底片的安全地点。如果暴风来到，破坏了房子，他可以使用保存在地下室的底片来替换那些被损坏的照片。每一份Logan的&#8220;重做笔记本&#8221;拷贝，被称为&#8220;归档的重做笔记本&#8221;。 <br />
可能某一天，你可以听到Sid和他次子之间的笑谈： <br />
Sid：：&#8220;Archie？你在哪里？&#8221; <br />
Archie：&#8220;老爸，我在自己房间里，Logan现在切换笔记本了吗？&#8221; <br />
Sid：&#8220;是的，他刚刚干完。&#8221; <br />
Archie：&#8220;知道了，老爸。我会复制这些底片并且制作一个新的笔记本放在地下室里。然后，我会更新&#8216;控制笔记本&#8217;，并且在&#8216;告警笔记本&#8217;里写一个记录。&#8221; <br />
Sid：&#8220;你是一个好孩子，我知道可以相信你。&#8221; <br />
1.1.5 Chuck的家务事 <br />
Sid最小的儿子Chuck确保每一件事情都是同步的。他的全名是Charles Kenneth Patrick Thomas。他衬衫上的字母是CKPT，Chuck的任务是将每一面墙壁、相片册和剪贴簿上的相片数字和控制笔记本中的数字协调起来。当他得到信号，他就开始在房子里奔跑起来，在每一面墙壁上写下数字，同时将同样的数字也记录在控制笔记本里。这使得每一件事情都协调起来。以下是一段Sid和Chuck的对话： <br />
Sid：&#8220;hi，Chuck。&#8221; <br />
Chuck：&#8220;老爸，Logan又开始更换笔记本了吗？&#8221; <br />
Sid：&#8220;是的，儿子，你知道规矩。带着目录编号1332935跑遍房间，把这个数字写到每一面墙壁的开头，每一个剪贴簿的封面和照片盒子的顶部。&#8221; <br />
Chuck：&#8220;没问题，给我几微秒时间搞定&#8221;。 <br />
Sid：&#8220;别忘记把1332935写在控制笔记本上！&#8221; <br />
Chuck：&#8220;老爸，我知道了，同样的事我一天内已经做过几百次了。&#8221; <br />
我敢打赌，你已经对阅读这个疯狂的Sid之家感到厌倦，是不是？到现在为止，你可能已经看出Sid有一个功能失常的家庭。功能失常？是的！不过却有效而可靠。Sid喜欢这样。 <br />
1.1.6控制笔记本 <br />
这个家庭怎样维持所有这些活动？Sid、Debbie、Logan、Archie和Chuck断定，要想把这项照片收集和整理工作处理的井井有条，必须要制作很多详细的笔记。他们每个人都把自己的东西写入一个日志，称之为&#8220;控制笔记本&#8221;。 <br />
控制笔记本有一个记录整个房子中每一堵墙壁、剪贴簿和照片盒子的家庭财产清单条目。如果Sid增加了一个房间，来放置更多的照片，他在控制笔记本里做一个记录。当Logan更换重做笔记本时，他在控制笔记本里做摘要记录。每次Archie制作一个归档的重做笔记本放入地下室时，他把名字和SCN的范围写在控制笔记本里。每次Chuck在房子里跑完一圈，他把细节也记录在控制笔记本里。这特殊的笔记本动态保存了所有地方的资产情况，和房子里以数字表示的进程。 <br />
1.1.7告警日志 <br />
时不时的总会有些意外发生，也可能出现错误。Debbie可能在把照片放进框架的时候发生问题，因为那面墙上已经没有多余的空间了。Archie可能无法折叠起底片条，因为有人把苏打水喷在上面。Sid考虑到了所有的可能，他买了一个螺旋轴的笔记本，放在厨房的抽屉里。在笔记本的面子上写上&#8220;告警日志&#8221;。每一个家庭成员将遇到的问题写在这个日志里。他们不仅要记下发生的错误，还要记下正常的活动过程。这个告警日志是一个用来保存在Sid家里已经和即将发生的事情的便利场所。如果他们要解释某个情形下额外的细节，他们制作一个新的&#8220;追踪笔记本&#8221;，把信息记录在里面。这样一来，这个告警笔记本不会变得比它原先的样子更杂乱。 <br />
1.1.8清晨程序 <br />
全家早晨一起醒来，也总是同时上床睡觉。他们称这些时间为一天的&#8220;启动&#8221;和&#8220;关闭&#8221;。下面是早晨的启动程序： <br />
Sid从床上起来，端上一杯咖啡开始他的一天。在咖啡壶边上，他将一系列指令保存在笔记本里，称之为初始化参数文件。阅读这列指令帮助他开始新的一天。啜着咖啡，他走过去确认控制笔记本是否放在老地方。他在房子里打转叫醒Debbie、Chuck、Logan、Archie、Simon和Pamela（你很快就会遇到他们）。 <br />
当每一个人都醒来后，就打开控制笔记本。确认根据控制笔记本的内容，所有的照片墙壁都没有问题，当所有的东西都被检查过以后，他打开房子迎接宾客，并开始拍摄照片。Sid雇佣了一个男管家，Simon，在早晨帮助他，Simon的燕尾服上写着字母SMON（省掉名字里的一个字母）。有些早晨房子里特别凌乱，因为在前一个就寝时间，家庭的每一个成员都没有及时清理好各自的事物。当Simon就位后，Sid打开窗帘，挂好电话，打开门锁，他的家庭开放，准备好了迎接客人。Sid和Simon可能这样开始一天: <br />
Simon：&#8220;早上好，先生。我今天能帮你做什么吗？&#8221; <br />
Sid：&#8220;是的Simon，早上好。看来我们这里很凌乱啊。我们昨天晚上突然中断了。你能否处理一下所有这些没有完成的照片和&#8216;回退&#8217;。&#8221; <br />
Simon：&#8220;当然了，所有这些底片在重做笔记本里的都要被重新制作，然后以简单的顺序放置在正确的框架里。&#8221; <br />
Sid：&#8220;你处理完这些后，接着处理&#8216;回退&#8217;，是吗？&#8221; <br />
Simon：&#8220;当然了，先生。我从回退储藏室里取出照片框架，然后把旧的版本放回它们原来的地方。&#8221; <br />
Sid：&#8220;太棒了，你完成后，我就打开房子。&#8221; <br />
1.1.9夜间程序 <br />
Sid家的夜间程序也很有趣。当Sid躺下准备休息的时候，他要求家里所有的东西都放好、关掉和停下。就寝时间的第一个行动是要求房子里所有的客人回家去。Sid晚上的情绪有四种情况。第一种，有时他很有耐性，等待所有的男女客人自行离去后，再就寝；第二种，Sid没有耐性，他亲自来监督每一个客人，当客人干完各自的事情（看照片等等）后，他给客人指示出门的方向；第三种，Sid非常没有耐性，他揪着客人陪他们出门，不让他们干完正在干的事；第四种，Sid拉下房子的电闸，大叫&#8220;时间到&#8221;，房子里一片狼藉。Simon不得不在第二天早晨来清理混乱的场面。 <br />
当一个客人走后留下一团糟时，Sid叫来他的女佣PamelaMonica。她监控客人的活动，并且在客人走后处理善后。她的清洁设备上贴着标签PMON。 <br />
如果Sid没有突然拉闸，每个人都打开灯，进行清理。同步处理笔记本来完成各自的任务。Debbie从DB_BUFFER_CACHE架子上取走所有的照片，放到合适的墙壁上。Logan确 <br />
保LOG_BUFFER架子是空的，所有的底片都在当前的重做笔记本里。Chuck在房子里兜一圈，用最高和最低的目录编号（SCN）来更新墙壁和笔记本。Archie把最后的那张底片放入归档的重做笔记本，放到后院的地下室。然后更新控制和告警笔记本。当每个人都干完后，Sid关灯，大伙儿睡觉。 <br />
1.1.10 Sid的问题 <br />
有时候，Sid家会出现问题。当以下这些事件中任何一件发生时，房子里的活动就会停止。 <br />
&#8226;当Sid醒来，而他无法找到初始化文件，则无法开始一天的工作。 <br />
&#8226;有时，Sid需要用Archie保存在后院地下室的底片来恢复丢失的照片，如果他丢失了一张底片，或者在恢复过程中底片遭到破坏。他无法恢复任何在那张无效底片以后拍摄 <br />
的所有照片。 <br />
&#8226;Sid一次丢失了几张底片。他不小心打开相机，曝光了胶卷。这使得他情绪极坏，他的世界好像走到了尽头。他联系了照相机厂家，他们提供了一个特殊的照相机，带有两个胶卷舱。如此一来，万一胶卷破坏了，他还可以指望另一个舱内的胶卷。Sid称之为镜像。 <br />
&#8226;如果后院的地下室满了，Archie没有空间来放置新的底片。Archie只是在地下室里等着新的空间。这使得Sid和Debbie也跟着等待，整个Sid的家庭活动陷于停顿状态。 <br />
&#8226;如果Debbie得了流感，卧病在床。你猜猜看会怎么样：Sid疯狂地关上了门。尽管有这些问题和其他一些家庭挫折及功能失常，但Sid的家庭仍然可以处理百万计的照片和数以千计的同时到访的客人。 <br />
和我一样，你可能会想知道，Sid怎么会有那么多的时间和精力来进行照片收集活动。他没有工作吗？事实上，没有。钱不是Sid的目标。他不必工作。他在几年以前完成了一个聪明的投资。他在1984年以后买入了大量的电脑公司的股票，那时它们刚开始向公众发行。他所投资的公司总部在加利福尼亚州的红树海岸。 <br />
在介绍了Sid的家庭后，你会发现他为家庭的所有活动设计了结构。就像这个家庭的活动一样，Oracle数据库也有空间、过程和程序。在脑中与这个家庭类比，我现在简短地描述Oracle数据库体系结构、过程和操作中属于Oracle数据备份和恢复的部分。可能你会发现和Sid家的相似之处。
<img src ="http://www.blogjava.net/gbk/aggbug/290545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gbk/" target="_blank">百科</a> 2009-08-10 15:08 <a href="http://www.blogjava.net/gbk/archive/2009/08/10/290545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>adobe flex</title><link>http://www.blogjava.net/gbk/archive/2008/10/28/237173.html</link><dc:creator>百科</dc:creator><author>百科</author><pubDate>Tue, 28 Oct 2008 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/gbk/archive/2008/10/28/237173.html</guid><wfw:comment>http://www.blogjava.net/gbk/comments/237173.html</wfw:comment><comments>http://www.blogjava.net/gbk/archive/2008/10/28/237173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gbk/comments/commentRss/237173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gbk/services/trackbacks/237173.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/gbk/aggbug/237173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gbk/" target="_blank">百科</a> 2008-10-28 17:27 <a href="http://www.blogjava.net/gbk/archive/2008/10/28/237173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss Seam--Java最优秀的快速开发框架之一</title><link>http://www.blogjava.net/gbk/archive/2008/10/07/232945.html</link><dc:creator>百科</dc:creator><author>百科</author><pubDate>Tue, 07 Oct 2008 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/gbk/archive/2008/10/07/232945.html</guid><wfw:comment>http://www.blogjava.net/gbk/comments/232945.html</wfw:comment><comments>http://www.blogjava.net/gbk/archive/2008/10/07/232945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gbk/comments/commentRss/232945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gbk/services/trackbacks/232945.html</trackback:ping><description><![CDATA[<font size="3">JBoss Seam，算得上是Java开源框架里面最优秀的快速开发框架之一</font>。<br />
<font size="3"><br />
<span style="font-size: large">一、Seam适应快速开发、简化框架的趋势</span><br />
<br />
在RoR 流行之前，Java社区的主流还是非常讲究分层、架构、复用和模式，而比较忽视快速开发和简化架构的，其结果就是代码量大、开发周期长、架构相当烦琐。以比较常见的Struts/Spring/Hibernate为例，从大的分层来说就有Web层、业务层和持久层，从细的分层就从前到后有：View(JSP) -&gt; Struts Action -&gt; Spring Business Object Bean -&gt; Spring DAO Bean -&gt; Hibernate Persistent Object。如果有Remoting调用，那么还需要相应的Service Facade层。每层都是用不同的技术框架或者模式、各层之间整合的方式也是五花八门。把整个项目的架构搭建起来，已经是非常麻烦的事情了。 <br />
<br />
Seam 给我的感觉像是一个异常简单的MVC框架，他实际上只有两层：JSF View和 Seam Component。而Seam Component有两类：一类是Entity Bean，另一类就是Session Bean。Entity Bean映射数据库表，Session Bean完成所有的业务逻辑，包括可能的持久化，事务，响应页面请求、商业逻辑，页面流控制等等。配置文件也不多，除了一堆基础的配置文件，唯一一个需要不断修改的就是pages.xml了，即配置JSF的view映射。
<p class="Xvz593"></p>
<br />
<br />
所以Seam开发项目看起来很简单、很直接，无分层之苦恼。相应的也会让程序员把精力主要放在业务逻辑组件的实现上，而不是把精力浪费在架构、分层、模式和基础设施搭建的工作上面。 <br />
<br />
<span style="font-size: large">二、Seam的数据绑定做的很出色</span><br />
<br />
由于是一个简单的两层结构，View和Component之</font> <font size="3">间的数据绑定做的很出色，看起来比我欣赏的Webwork的数据绑定方式更胜一筹。官 方的说法叫做双向依赖注入，在component里面可以直接取到页面提交的数据，在页面也可以直接访问component数据。 <br />
<br />
另外持久化数据的校验也直接集成好了，在EntityBean里面声明数据的约束，在页面就可以直接校验了，和RoR的数据校验方式是一样的，当然这也得益于Gavin King是Seam和Hibernate两个项目的作者的缘故。 <br />
<br />
<span style="font-size: large">三、Seam的组件机制看起来相当好用</span><br />
<br />
既然Seam简化了分层，实际上把主要的工作都推到组件层去完成了。但是Seam的组件层看起来很简单，这得益于Seam的组件机制设计了很多的组件状态，根据不同的组件状态，天然的划分了不同组件的功能和逻辑。 <br />
<br />
Seam 的组件有点类似于把传统MVC的Action和Spring的Bean合二为一了，但还是不同于传统的MVC框架下面的Action：传 统的MVC Action是基于页面请求的，无法复用，而Seam的组件是事件驱动方式，它只需要捕获和实现事件代码就可以了，至于怎么触发它并不需要知道，他和 Web层可以不绑定，因此理论上面来说是可以实现组件复用的。我个人认为Seam的这个组件机制非常巧妙，既可以用来实现响应页面事件，绑定页面数据的所谓Web Bean，也可以用来实现和Web没有任何关系的纯业务逻辑组件，一个很漂亮的实现。 <font color="#ffffff"></font><br />
<br />
另外Seam的组件注入机制看起来也很简单，不像Spring那样麻烦，而且内置了很多现成的组件进来，直接用Annotation声明一下就可以用了，感觉写组件真的很方便、很灵活、很强大。 <br />
<br />
<span style="font-size: large">四、Seam把数据库资源的管理和事务的封装完全隐藏起来了</span><br />
<br />
Spring 的数据库资源管理和事务封装是通过提供了一系列的代理类以及配置文件来实现的，程序员还是要通过配置文件的方式来手工管理事务，访问数据库也必须通过Template编写匿名内部类来实现，而且在Spring/Hibernate框架下面，OpenSessionInView是一个很讨厌的问题。 <br />
<br />
但是Seam已经把数据库资源的管理和事务的封装全部都隐藏起来了，程序员完全不需要知道，也不需要操心这些事情，这真是个大大的解放。当然 Seam可以做到这一点，也无非是因为Seam提供了一套上至View层，下至持久层完整的框架，因此可以把实现细节隐藏在框架内部，不暴露给程序员。 Spring之所以做不到这一点，也因为他只充当了一个黏合剂，不能够直接修改View层和持久层带来的限制。 <br />
<br />
<span style="font-size: large">五、Seam对第三方框架的整合看起来比Spring更深入</span><br />
<br />
原来印象当中只有Spring才提供了一站式的解决方案，这次一看Seam文档，呵！发现Seam也都齐全了，什么邮件啦、工作流啦、页面流啦、规则引擎啦、异步任务调度啦、消息系统啦、Web服务啦、远程调用啦、甚至全文检索啦全部都集成了。而且集成的比Spring更深入一些，例如Java EE本身的JMS，MDB自然是Seam的强项，而JBoss自家的JBPM，JPDL，Rules集成的更加没得说。
<div class="Xvz593"></div>
<br />
<br />
从整合角度来说，感觉Spring和Seam的出发点不同：Spring更像一个平台，我提供整合的可能性，然后程序员你自家去整合，我提供一些写好的整合bean，对于这些你通过XML配置一下就整合进来了，如果我没有提供bean的，那么你也可以自己写bean来整合。而Seam更像一个完整的框架而不是平台，我这个框架想提供的功能，框架自身就已经整合好了，你直接用就是了，你也可以自己写扩展来整合，但是这个不是Seam希望程序员做的事情。 <br />
<br />
因此对于程序员的感觉来说，Spring给你提供了一切的零件和半成品，但你要自己动手来组装，而Seam已经给你装好了一个成品，你就别自己改装了，直接拿去用吧。 <br />
<br />
<span style="font-size: large">六、Seam提供了方便的代码生成器</span><br />
<br />
和appfuse 类似，可以直接用ant task来生成一个完整项目的骨架，以及相应的组件代码生成器，利用seam-gen可以快速生成一个完整的、带有AJAX功能的CRUD项目，而且还是一个eclipse或者netbeans工程，你可以直接用IDE打开编辑了。这功能虽然不太难做，但是对于程序员来说，帮助是很大的。Seam做的相当不错。 <br />
<br />
<br />
以上是我对Seam的一点小小的赞许，当然我也有一点疑问： <br />
<br />
<span style="font-size: large">一、Seam的View实现是JSF，看页面代码还是密密麻麻的Tag</span> <font color="#ffffff"></font><br />
<br />
我是非常反感JSP Tag的，看看页面密密麻麻的Tag就头皮发麻，能不能弄一个Template呀，例如freemarker啥的？这些Tag既不直观，也不方便扩展。需要扩展页面组件，总不能让我自定义Tag去干活吧？不清楚这个问题怎么办？像freeamarker还可以方便的自定义页面宏呢。 <br />
<br />
<span style="font-size: large">二、每次修改都要重新打包发布，太麻烦了吧</span><br />
<br />
就算修改一个页面，也要整个打包deploy成为一个ear去拷贝到jboss的应用目录下面，这个要是改页面，不是得烦死？ 我以前都是在项目里面直接内嵌Jetty，作为一个application启动，修改页面根本无需重起呀，更不要说deploy了。 <br />
<br />
总体来说，我觉得Seam框架非常出色，尤其是他的组件机制设计的很有匠心，真不愧是Gavin King精心打造的框架了，虽然看起来还是有些缺陷，但是做企业应用项目的话，Seam是一个很棒的选择，作为程序员来说，要比用 Spring/Hibernate/Struts省心的多，更能够把精力放在业务逻辑的编写上面，开发效率也很不错，可能是Java开源框架里面最优秀的快速开发框架之一了</font>
<img src ="http://www.blogjava.net/gbk/aggbug/232945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gbk/" target="_blank">百科</a> 2008-10-07 16:38 <a href="http://www.blogjava.net/gbk/archive/2008/10/07/232945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss Seam--Java最优秀的快速开发框架之一</title><link>http://www.blogjava.net/gbk/archive/2008/10/07/232944.html</link><dc:creator>百科</dc:creator><author>百科</author><pubDate>Tue, 07 Oct 2008 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/gbk/archive/2008/10/07/232944.html</guid><wfw:comment>http://www.blogjava.net/gbk/comments/232944.html</wfw:comment><comments>http://www.blogjava.net/gbk/archive/2008/10/07/232944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gbk/comments/commentRss/232944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gbk/services/trackbacks/232944.html</trackback:ping><description><![CDATA[<font size="3">JBoss Seam，算得上是Java开源框架里面最优秀的快速开发框架之一</font>。<br />
<font size="3"><br />
<span style="font-size: large">一、Seam适应快速开发、简化框架的趋势</span><br />
<br />
在RoR 流行之前，Java社区的主流还是非常讲究分层、架构、复用和模式，而比较忽视快速开发和简化架构的，其结果就是代码量大、开发周期长、架构相当烦琐。以比较常见的Struts/Spring/Hibernate为例，从大的分层来说就有Web层、业务层和持久层，从细的分层就从前到后有：View(JSP) -&gt; Struts Action -&gt; Spring Business Object Bean -&gt; Spring DAO Bean -&gt; Hibernate Persistent Object。如果有Remoting调用，那么还需要相应的Service Facade层。每层都是用不同的技术框架或者模式、各层之间整合的方式也是五花八门。把整个项目的架构搭建起来，已经是非常麻烦的事情了。 <br />
<br />
Seam 给我的感觉像是一个异常简单的MVC框架，他实际上只有两层：JSF View和 Seam Component。而Seam Component有两类：一类是Entity Bean，另一类就是Session Bean。Entity Bean映射数据库表，Session Bean完成所有的业务逻辑，包括可能的持久化，事务，响应页面请求、商业逻辑，页面流控制等等。配置文件也不多，除了一堆基础的配置文件，唯一一个需要不断修改的就是pages.xml了，即配置JSF的view映射。
<p class="Xvz593"></p>
<br />
<br />
所以Seam开发项目看起来很简单、很直接，无分层之苦恼。相应的也会让程序员把精力主要放在业务逻辑组件的实现上，而不是把精力浪费在架构、分层、模式和基础设施搭建的工作上面。 <br />
<br />
<span style="font-size: large">二、Seam的数据绑定做的很出色</span><br />
<br />
由于是一个简单的两层结构，View和Component之</font> <font size="3">间的数据绑定做的很出色，看起来比我欣赏的Webwork的数据绑定方式更胜一筹。官 方的说法叫做双向依赖注入，在component里面可以直接取到页面提交的数据，在页面也可以直接访问component数据。 <br />
<br />
另外持久化数据的校验也直接集成好了，在EntityBean里面声明数据的约束，在页面就可以直接校验了，和RoR的数据校验方式是一样的，当然这也得益于Gavin King是Seam和Hibernate两个项目的作者的缘故。 <br />
<br />
<span style="font-size: large">三、Seam的组件机制看起来相当好用</span><br />
<br />
既然Seam简化了分层，实际上把主要的工作都推到组件层去完成了。但是Seam的组件层看起来很简单，这得益于Seam的组件机制设计了很多的组件状态，根据不同的组件状态，天然的划分了不同组件的功能和逻辑。 <br />
<br />
Seam 的组件有点类似于把传统MVC的Action和Spring的Bean合二为一了，但还是不同于传统的MVC框架下面的Action：传 统的MVC Action是基于页面请求的，无法复用，而Seam的组件是事件驱动方式，它只需要捕获和实现事件代码就可以了，至于怎么触发它并不需要知道，他和 Web层可以不绑定，因此理论上面来说是可以实现组件复用的。我个人认为Seam的这个组件机制非常巧妙，既可以用来实现响应页面事件，绑定页面数据的所谓Web Bean，也可以用来实现和Web没有任何关系的纯业务逻辑组件，一个很漂亮的实现。 <font color="#ffffff"></font><br />
<br />
另外Seam的组件注入机制看起来也很简单，不像Spring那样麻烦，而且内置了很多现成的组件进来，直接用Annotation声明一下就可以用了，感觉写组件真的很方便、很灵活、很强大。 <br />
<br />
<span style="font-size: large">四、Seam把数据库资源的管理和事务的封装完全隐藏起来了</span><br />
<br />
Spring 的数据库资源管理和事务封装是通过提供了一系列的代理类以及配置文件来实现的，程序员还是要通过配置文件的方式来手工管理事务，访问数据库也必须通过Template编写匿名内部类来实现，而且在Spring/Hibernate框架下面，OpenSessionInView是一个很讨厌的问题。 <br />
<br />
但是Seam已经把数据库资源的管理和事务的封装全部都隐藏起来了，程序员完全不需要知道，也不需要操心这些事情，这真是个大大的解放。当然 Seam可以做到这一点，也无非是因为Seam提供了一套上至View层，下至持久层完整的框架，因此可以把实现细节隐藏在框架内部，不暴露给程序员。 Spring之所以做不到这一点，也因为他只充当了一个黏合剂，不能够直接修改View层和持久层带来的限制。 <br />
<br />
<span style="font-size: large">五、Seam对第三方框架的整合看起来比Spring更深入</span><br />
<br />
原来印象当中只有Spring才提供了一站式的解决方案，这次一看Seam文档，呵！发现Seam也都齐全了，什么邮件啦、工作流啦、页面流啦、规则引擎啦、异步任务调度啦、消息系统啦、Web服务啦、远程调用啦、甚至全文检索啦全部都集成了。而且集成的比Spring更深入一些，例如Java EE本身的JMS，MDB自然是Seam的强项，而JBoss自家的JBPM，JPDL，Rules集成的更加没得说。
<div class="Xvz593"></div>
<br />
<br />
从整合角度来说，感觉Spring和Seam的出发点不同：Spring更像一个平台，我提供整合的可能性，然后程序员你自家去整合，我提供一些写好的整合bean，对于这些你通过XML配置一下就整合进来了，如果我没有提供bean的，那么你也可以自己写bean来整合。而Seam更像一个完整的框架而不是平台，我这个框架想提供的功能，框架自身就已经整合好了，你直接用就是了，你也可以自己写扩展来整合，但是这个不是Seam希望程序员做的事情。 <br />
<br />
因此对于程序员的感觉来说，Spring给你提供了一切的零件和半成品，但你要自己动手来组装，而Seam已经给你装好了一个成品，你就别自己改装了，直接拿去用吧。 <br />
<br />
<span style="font-size: large">六、Seam提供了方便的代码生成器</span><br />
<br />
和appfuse 类似，可以直接用ant task来生成一个完整项目的骨架，以及相应的组件代码生成器，利用seam-gen可以快速生成一个完整的、带有AJAX功能的CRUD项目，而且还是一个eclipse或者netbeans工程，你可以直接用IDE打开编辑了。这功能虽然不太难做，但是对于程序员来说，帮助是很大的。Seam做的相当不错。 <br />
<br />
<br />
以上是我对Seam的一点小小的赞许，当然我也有一点疑问： <br />
<br />
<span style="font-size: large">一、Seam的View实现是JSF，看页面代码还是密密麻麻的Tag</span> <font color="#ffffff"></font><br />
<br />
我是非常反感JSP Tag的，看看页面密密麻麻的Tag就头皮发麻，能不能弄一个Template呀，例如freemarker啥的？这些Tag既不直观，也不方便扩展。需要扩展页面组件，总不能让我自定义Tag去干活吧？不清楚这个问题怎么办？像freeamarker还可以方便的自定义页面宏呢。 <br />
<br />
<span style="font-size: large">二、每次修改都要重新打包发布，太麻烦了吧</span><br />
<br />
就算修改一个页面，也要整个打包deploy成为一个ear去拷贝到jboss的应用目录下面，这个要是改页面，不是得烦死？ 我以前都是在项目里面直接内嵌Jetty，作为一个application启动，修改页面根本无需重起呀，更不要说deploy了。 <br />
<br />
总体来说，我觉得Seam框架非常出色，尤其是他的组件机制设计的很有匠心，真不愧是Gavin King精心打造的框架了，虽然看起来还是有些缺陷，但是做企业应用项目的话，Seam是一个很棒的选择，作为程序员来说，要比用 Spring/Hibernate/Struts省心的多，更能够把精力放在业务逻辑的编写上面，开发效率也很不错，可能是Java开源框架里面最优秀的快速开发框架之一了</font>
<img src ="http://www.blogjava.net/gbk/aggbug/232944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gbk/" target="_blank">百科</a> 2008-10-07 16:38 <a href="http://www.blogjava.net/gbk/archive/2008/10/07/232944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp request get的对象</title><link>http://www.blogjava.net/gbk/archive/2008/06/10/206922.html</link><dc:creator>百科</dc:creator><author>百科</author><pubDate>Tue, 10 Jun 2008 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/gbk/archive/2008/06/10/206922.html</guid><wfw:comment>http://www.blogjava.net/gbk/comments/206922.html</wfw:comment><comments>http://www.blogjava.net/gbk/archive/2008/06/10/206922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gbk/comments/commentRss/206922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gbk/services/trackbacks/206922.html</trackback:ping><description><![CDATA[request.getScheme() —— http<br />
request.getServerName() —— localhost<br />
request.getServerPort() —— 8080<br />
request.getContextPath() —— /vote<br />
request.getProtocol() —— HTTP/1.1<br />
request.getRemoteAddr() —— 127.0.0.1<br />
request.getRemoteHost() —— 127.0.0.1<br />
request.getRemotePort() —— 1316<br />
request.getRequestURI() —— /vote/test.jsp<br />
request.getRequestURL() —— <a href="http://localhost:8080/vote/test.jsp" target="_blank">http://localhost:8080/vote/test.jsp</a><br />
request.getServletPath() —— /test.jsp&nbsp;&nbsp;
<img src ="http://www.blogjava.net/gbk/aggbug/206922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gbk/" target="_blank">百科</a> 2008-06-10 14:34 <a href="http://www.blogjava.net/gbk/archive/2008/06/10/206922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>