2006年2月18日
开学第一周在匆匆忙忙的脚步中过去了!下了一周的雨也终于停了,第一个周末,也没什么大事情,就拿struts来开开涮吧!
说干就干!因为自己以前已经看过一点struts,并且做过一个小例子(记得以前好像有个wizard,就是教你一步步用struts)。但还没有深入它的代码,对它的流程当时了解过,不过现在忘了,唉,岁月不饶人,不服老不行,看着记性!
先把struts做个Introduction吧,正好在介绍的同时也给自己一个整理的机会,看了一天了,整理一下思路吧!
首先讲到struts,就不能不提Model 2,讲到Model 2就不能不提到Model 1(),其实,这三者都离不开一个东西,就是java中web application里面的最基本也是最重要的东西,servlet,不错,我认为它是个基础(个人看法:),servlet是个好东西,sun公司认为有两种类型的web application:1、Presentation-oriented 2、Service-oriented。随着Web被逐渐用于deliver service,那些service providers逐渐认识到在Web中提供动态内容的重要性。随之出现了CGI。CGI的缺点我就不说啦,其实我没大用过CGI,汗一个!不过据说是有很多缺点的,比如平台相关性,lack of scalability。于是servlet适时而出了!
关于servlet的细节我就不具体提了,我也有待学习,这里之所以提到servlet,是因为struts中的一个核心部件就是一个servlet,所以在这里简单提一下servlet,以供读者检查自己是否应该先去了解一下servlet。Model 1简单讲就是只用JSP,而不用servlet,这里的用与不用,仅是对web开发人员而言,因为JSP最终还是会被translate为servlet(这里用translate是遵照官方用词,国内很多书翻为编译,个人认为不是很恰当)。其实出现Model 1的原因也很简单,因为用servlet来构造一个网页不胜其烦,一堆的out.pringln(...)让人整个感觉是手工构造一个网页,在这个所见即所得的今天,我们可能永远无法想象它的繁琐性!于是出现了JSP,把那些工作交给了web container,我们只需用所见即所得的tool构造web,然后在web中适当的地方加入java代码即可。好,点到为止,再具体就是jsp的内容了。但后来人们发现,完全抛弃servlet并不是一个好的idea,其中的一个关键问题就是content与presentation混杂在一起,非常不利于维护和修改。于是人们又提出了结合jsp与servlet来开发web,这就是Model 2,它本质上是经典MVC模式的一个变种。这里推荐一篇文章Understanding JavaServer Pages Model 2 architecture ,专门介绍Model2的,希望对大家有所帮助,这也是struts官方网站上推荐的一篇文章!由于我们的主题是struts,所以我们就不细谈这篇文章了。
当然我也希望读者对MVC模式有所了解,如果否,请看MVC的源头。了解一下它吧,一个很好的东东!
好,准备东西讲完了,我们下面开始看struts!
struts从结构上讲是符合Model2的,先简单介绍一下它的情况,它的目的就是要解决Model 1中的flow control的问题,并使得内容(Model)与表现(View)彻底分离。Struts是在2000年5月由Craig R. McClanahan发起的。并在2001年7月发布了1.0版。(休息一下)
posted @ 2006-02-18 21:06 未来刀客 阅读(221) | 评论 (0)编辑 收藏
  2006年1月4日
真不走运,要考试了,天突然变的冷起来了,风和着雨,还夹着雪,2006年的第一场雪,呵呵,不过还好,考的是科学社会主义,而且开卷,希望接下来的考试也能顺顺利利,雪既然下了就下大一点吧,考完试好拍点玉照,留个纪念!
posted @ 2006-01-04 16:36 未来刀客 阅读(205) | 评论 (1)编辑 收藏
  2006年1月1日
时间进入了2006年,今天是第一天,在新年之初,先给自己许个愿吧,一来代表自己对美好生活的憧憬,二来嘛也代表自己的愿望和目标,以鞭策自己继续奋斗
首先希望我跟莉都身体健康,身体是革命的本钱啊!
其次希望我跟莉的学业都“大越进”!
最后祝我的亲朋好友新年都万事如意!也祝愿未来公司的事业蒸蒸日上!
posted @ 2006-01-01 10:03 未来刀客 阅读(173) | 评论 (0)编辑 收藏
  2005年12月30日

概述
Eclipse中最出彩的部分莫过于它的Plugin Framework,可以说Eclipse在一定程度上使得Plugin机制得以流行,当然,Eclipse的优势不仅仅在此,但正因为采用了Plugin机制,Eclipse才得以被不断的扩充,越来越强大。一直以来就想分析Eclipse的Plugin Framework,由于各种原因一直耽搁,刚好这个周末没什么事,下定决心对其进行了研究和分析,方法很原始,就是对Eclipse的启动过程进行分析,基于的是Eclipse 3.1的版本,分析过程就不在这说了,主要是说说分析出来的心得。
架构上来讲Eclipse基本采用的是Kernel+Core Plugins+Custom Plugins的结构体系,除了Kernel部分外均为Plugin,所以可称为all are plugins,凡是Plugin的部分都是可被替换的。

OSGI
Eclipse 3.0后采用的是OSGI来作为其Plugin Architecture实现的依据,鉴于此就得简单提提OSGI了,主要从Plugin的角度来分析OSGI,OSGI概念中主要分为了Bundle和Service,可以认为Bundle是一个模块的管理器,主要是通过BundleActivator管理模块的生命周期,而Service则是这个模块可暴露对外的服务对象,这里体现了OSGI和传统的Plugin Framework不同的一个地方,管理和静态结构分开,在OSGI中通过在manifest.mf文件中增加一些内容来发布Bundle,在其中描述了Bundle的提供商、版本、唯一ID、classpath、暴露对外的包、所依赖的包;每个Bundle拥有自己的ClassLoader以及context,通过context可进行服务的注册、卸载等,这些操作都会通过事件机制广播给相应的其他的Bundle;一般来说都为通过在Bundle中编写初始需要注册的服务的方法来完成Bundle可供外部使用的服务的暴露功能;如需要调用其他Plugin提供的服务可通过context的getServiceReference先获取Service的句柄,再通过context.getService(ServiceReference)的方法获取Service的实体。

Eclipse Plugin定义
Eclipse中的Plugin的概念为包含一系列服务的模块即为一个Plugin。既然是遵循OSGI的,也就意味着Plugin通常是由Bundle和N多Service共同构成的,在此基础上Eclipse认为Plugin之间通常存在两种关系,一种为依赖,一种为扩展,对于依赖可通过OSGI中元描述信息里添加需要引用的Plugin即可实现,但扩展在OSGI中是没有定义的,Eclipse采用了一个Extension Point的方式来实现Plugin的扩展功能。
结合OSGI
Eclipse遵循OSGI对于Plugin的ID、版本、提供商、classpath、所依赖的plugin以及可暴露对外的包均在manifest.mf文件中定义。
Plugin Extension Point
对于扩展,Eclipse采用Extension Point的方式来实现,每个Plugin可定义自己的Extension Point,同时也可实现其他Plugin的Extension Point,由于这个在OSGI中是未定义的,在Eclipse中仍然通过在plugin.xml中进行描述,描述的方法为通过<extension-point id="" name="" schema="">的形式来定义Plugin的扩展点,通过<extension point="">的形式来定义实现的其他Plugin的扩展点,所提供的扩展点通过schema的方式进行描述,详细见eclipse extension-point schema规范,为了更好的说明扩展点这个概念,举例如下,如工具栏就是工具栏Plugin提供的一个扩展点,其他的Plugin可通过此扩展点添加按钮至工具栏中,并可相应的添加按钮所对应的事件(当然,此事件必须实现工具栏Plugin此扩展点所要求的接口),工具栏的Plugin将通过callback的方式来相应的响应按钮的动作。可见通过Extension Point的方式可以很好的提供Plugin的扩展方式以及实现扩展的方式。

Eclipse Plugin Framework
那么Eclipse是如何做到Plugin机制的实现的呢??还是先讲讲Eclipse的设计风格,Eclipse在设计时有个重要的分层法则,即语言层相关和语言层无关的代码分开(如jdt.core和core),核心与UI分开(如workbench.ui和workbench.core)这两个分层法则,这个在Eclipse代码中处处可见,在Plugin Framework部分也充分得体现了这个,遵循OSGI,Eclipse首先是实现了一个OSGI Impl,这个主要通过它的FrameWork、BundleHost、ServiceRegistry、BundleContextImpl等对象来实现,如果关心的话大家可以看看这部分的代码,实现了Bundle的安装、触发、卸载以及Service的注册、卸载、调用,在Plugin机制上Eclipse采用的为lazy load的方式,即在调用时才进行实际的启动,采用的为句柄/实体的方式来实现,外部则通过OSGI进行启动、停止等动作,各Plugin则通过BundleContext来进行服务的注册、卸载和调用,这是OSGI的部分实现的简单介绍。
那么Extension Point方面Eclipse是如何实现的呢,在加载Plugin时,Eclipse通过对plugin.xml的解析获取其中的<extension-point>节点和<extension>节点,并相应的注册到ExtensionRegistry中,而各个提供扩展点的Plugin在提供扩展点的地方进行处理,如工具栏Plugin提供了工具栏的扩展点,那么在构成工具栏时Plugin将通过Platform.getPluginRegistry().getExtensionPoint(扩展点ID)的方法获取所有实现此扩展点的集合IExtensionPoint[],通过此集合可获取IConfigurationElement[],而通过这个就可以获取<extension point="">其中的配置,同时还可通过IConfigurationElement创建回调对象的实例,通过这样的方法Eclipse也就实现了对于Plugin的扩展以及扩展的功能的回调。在Plugin Framework中还涉及很多事件机制的使用,比如Framework的事件机制,以便在Bundle注册、Service注册的时候进行通知。

总结
通过对Eclipse启动过程的分析,可清晰的看到Eclipse Kernel+Core Plugins+Application Plugins的方式,在代码中分别对应为loadBasicBundles和registerApplicationServices,loadBasicBundles通过加载config.ini中的osgi.bundles完成基本的bundles的加载,去看看这个配置会发现是org.eclipse.core.runtime还有一个update,core.runtime又会通过IDEApplication来完成整个Eclipse的启动,同时会注册所有与workbench相关的plugin。
Eclipse由于以前版本的Plugin Framework是没有采用OSGI的,所以通过EclipseAdaptor的方式来实现与以往的兼容,目前新的Plugin采用的方式基本就是manifest.mf描述Plugin OSGI部分的信息,Plugin.xml描述扩展点的信息。
Eclipse中有非常多优秀的设计,这个在看它的代码时会有很深的感触,比如Contributing to Eclipse中提到的Extension Object/Interface的设计,确实是非常的不错,虽然看到你可能觉得很简单,关键是要想得到并合适的去使用。
总结陈词,^_^,Eclipse Plugin Framework是采用OSGI Impl+Plugin Extension-Point的方式来共同实现的,实现了Plugin的部署、编写、独立的Classloader和Context、Plugin中Service的注册、Plugin中Service的调用、Plugin的依赖、Plugin的扩展、Plugin生命周期的管理。

带来的思考
Eclipse Plugin Framework采用的是OSGI的实现,一定程度上我们也能看到OSGI的优点,那么JMX+IoC方式的Plugin Framework与其的比较又是在哪些方面呢?Eclipse Plugin Framework不足的地方又在哪里呢?哪些地方值得改进呢?

posted @ 2005-12-30 19:05 未来刀客 阅读(703) | 评论 (0)编辑 收藏
虽然圣诞已经过去好几天了,可是那天的经历却仍历历在目,终究是一个不寻常的圣诞,略记于此,以供后寻!
平安夜的那天下午,我跟莉商量去哪吃饭,莉说她有豪客来的优惠券,于是我们决定去离学校最近的那家分店去吃,虽说是离学校最近,但其实也不是很近,不过还好,幻想着坐在舒服的位置上,两人四目相对,吃着跟节日气氛很相称的西餐...,我们一路说笑着就到了,但同时我们就几乎就失望了,我们看到的是站着排队的比坐着吃的人还多,我们还不死心,于是我们就进去问,waitress很礼貌的打招呼“圣诞快乐!”,是的,整个餐厅里面只有他们这些服务人员不觉着不舒服,其他无论坐着的还是站着的,肯定都会觉着有点郁闷,站着的想着还要等多久啊,还想吃完了去逛逛呢,坐着的呢,想好不容易来吃顿西餐,这么多人围观,一点气氛都没有。于是我跟莉莉决定杀向新街口去吃悠闲美地吃他们的特色“鲍汁虾仁饭”,说起这个饭,还得感谢我的老板匡先生,是一次他作东时介绍给我的,果然一吃上瘾,后来曾和莉去吃过数次。
由于离车站已经比较远了,但离新街口不是太远,于是我们决定徒步前进,那会感觉还蛮好的,在平安夜,两个人手牵手走在大街上,莉还给我一块蛋糕吃,说是宿舍一姐妹送的,感觉真的不错,很快我们就到了新街口,路上我们还曾看到另外一个豪客来分店也是人满为患,但是到了新街口,我们的心又悬起来了,因为.......人实在太多了,不,应该说是暴多。于是我们抱怨中国人实在太多了,莉开始大喊我要出国,我要出国,果然不出我们所料,悠闲美地也是排了一个长队。没办法,我们只得妥协,我提议去吃麦当劳,莉也同意了,但是当我们到达麦当劳时,我们发现,连汉堡也要跟我们说88了,就这样一个圣诞节过了快一半了,我们连个坐下的位子都还没找到。打道回府,我们决定去吃金润发旁边的一家西餐厅,我想那里远离新街口,应该人少一点吧。
当我们冲进去的时候,服务员微笑着对我们说“欢迎光临”,我知道这次有戏了,可是她却把我们引到了一个最角落里的位子,这到无所谓,关键是那个位子正对着金润发,而且有个玻璃门,人进进出出,而且很吵,于是我们愤而离开,该死的圣诞节,或许我们应该留在学校吃食堂的,我们俩都有了这个想法,但是已经折腾这么久了,我们都不甘心,我们决定去吃我们曾路过的一家烧烤店,路上遇到一个卖掉渣饼的小摊,莉怕我饿了又发脾气(她的经验)就买了一个,我们边走边吃,味道确实还不错,我们商量着待会吃完饭再来买一个...
虽然烟雾缭绕,但毕竟还有位子,我们终于坐下了,开始了我们浪漫的平安夜大餐...
posted @ 2005-12-30 18:51 未来刀客 阅读(296) | 评论 (0)编辑 收藏

前几天忙着排练小品《大话读研》,是在迎新晚会上演出的,自己觉得自己蛮投入的,也可以看得出来,我们这个剧组的其他成员也都很投入,当然演出效果也比较令人满意,至少观众反映还是不错的,着实令人欣慰。不过,参加这个剧组,却让我体会到了另外一种感觉,那就是团队合作的精神,其实我觉着在这方面,我们现在很多人都存在着不足,但是很多人却没有意识到,而这次的合作,让我对团队精神有了新的理解,首先要有团队意识,比如开会,你要想着不能迟到,因为如果你迟到,等待你的将是整个团队,你浪费了所有人的时间,所以要心有团队。其次,团队说白了其实就是由很多人组成的,所以你必须同团队里的每个人交互,有时需要保留个人意见,有时需要及时纠正别人的做法,也就是说团队最后的走向取决于大家的合力,如果一个团队里面大多数人都很消极或者说做错了,那么可想而知这个团队的结果是什么了,要么解散,要么演出失败。最后一点团队需要一个有力的“领导”,我这里对领导加引号,是因为我并不是说领导代表一种权利,高人一等,随便发号施令,我认为领导在团队中的作用是协调、沟通,在团队中存在争议时,能迅速解决争议,使的团队的进步不因个人的问题而停止或中断,另外对团队领导的要求就是要有计划,有合理的安排,使得每个人能够尽量独立的发挥自己的聪明才干。

与此同时,我又参加了整场晚会的场地负责工作,包括预定场地、入场检票、分发食品、颁奖、音乐控制等。由于缺乏经验加之没有计划好,晚会刚开始的时候,场地一片混乱,入场处拥挤不堪,音乐控制处找不到伴奏带等,我是又忙又急,还好在大家的集体努力下,很快扭转了局面,也使我再一次感受到了团队的力量。

总结起来,这次晚会之所以出现开场时的混乱局面,我认为有以下几个原因:

1、  我们工作人员入场太晚,而这又是因为我们跟场地预定处没协调好

2、  食品与奖品等运到现场也太晚,直接导致了入场检票一度无法做,以及音乐控制处在等节目单和伴奏带

3、  整体没有配合好,比如场地如何布置,没有人告诉我们该如何安排,导致后来节目快开始的时候又重新安排

这又使我想起莉莉(偶GF)的一句常说的话,“凡事尽量提前准备好”,不错,这次我们就是在没有提前准备好,导致了现场的混乱。

对于我个人来说,这的确是第一次负责这种工作,所以没有什么经验,对于突发情况的处理显得手足无措,但同时也给我一次锻炼的机会,虽然当时说了很多抱怨的话,但其实我还是不后悔负责这个工作,因为它让我领会到一个小小的活动,想要把它搞好,也并不是很容易的。“麻雀虽小,五脏具全”嘛!

posted @ 2005-12-30 16:50 未来刀客 阅读(270) | 评论 (0)编辑 收藏

脱离了自己有些厌倦的工作环境,来到了自己心仪已久的南大,并如愿进入了自己喜欢的专业,似乎生活应该一下子美好了,可是,事实并非如此...
除了刚开始的几天新鲜之外,接下来感觉自己又进入了另外一个循环,是的,只不过是跟以前的那个循环内容不同而已,但本质上还是一个循环。它有好的一面,说明我已经融入了这个环境,可是它也同时让自己觉得跟以前的生活没什么差别,唉,我于是感叹,生活就是这样,一山望着一山高,可是等你爬上去之后,发现也不过如此,有人说,正是人的这种不满足才推动了世界的发展,或许吧。但是我想说的是,人很容易在这种每天周而复始的循环中迷失自己,现在自己已经很少思考了,特别是对自己正在做什么,将来要做什么,这些问题考虑的越来越少了,每天干着自己也不知道为什么要做的事,但是又觉着是理所当然要做的事,可是等哪天突然想起来的时候,就觉着很后悔,正所谓蓦然回首,自己应该做的事居然都还没做,于是我就问自己,那我做了什么呢?于是我茫然了,除了每天例行的吃喝拉撒,似乎就是泡在实验室,在我庆幸自己能有个像实验室这种栖身之所的时候,却不知有多少宝贵的时间也就在这里毫无价值的流失...
于是我恍然,记得新东方的渝敏洪先生曾经到我们学校做过一个报告,我有幸得以一睹这位传说中的人物,他的一句话让我记忆忧新,他说,每天晚上睡觉前,他都会问自己,今天我做了什么有意义的事,如果实在想不起来有什么让自己能记起的事,他就会拿出字典来背上几个单词,然后他会问自己我明天准备做什么。我想渝先生的这个习惯正是要监督自己,不让自己每天虚度光阴,而是要把握属于自己的每一分钟,更不能让无所事事来蚕食每天的光阴。
古人云:“见贤思齐焉,见不贤而内自省焉”,向渝先生学习一下怎么来把握自己的每一天吧!毕竟生活就是每一天!

posted @ 2005-12-30 16:09 未来刀客 阅读(250) | 评论 (0)编辑 收藏
仅列出标题