??xml version="1.0" encoding="utf-8" standalone="yes"?>丁香婷婷深情五月亚洲,亚洲永久一区二区三区在线,欧美国产综合http://www.aygfsteel.com/linq/archive/2006/02/18/31416.html未来刀?/dc:creator>未来刀?/author>Sat, 18 Feb 2006 13:06:00 GMThttp://www.aygfsteel.com/linq/archive/2006/02/18/31416.htmlhttp://www.aygfsteel.com/linq/comments/31416.htmlhttp://www.aygfsteel.com/linq/archive/2006/02/18/31416.html#Feedback0http://www.aygfsteel.com/linq/comments/commentRss/31416.htmlhttp://www.aygfsteel.com/linq/services/trackbacks/31416.html说干干Q因׃前已l看q一点strutsQƈ且做q一个小例子Q记得以前好像有个wizardQ就是教你一步步用strutsQ。但q没有深入它的代码,对它的流E当时了解过Q不q现在忘?IMG height=19 src="http://www.aygfsteel.com/Emoticons/cry_smile.gif" width=19 border=0>Q唉Q岁月不饶hQ不服老不行,看着记性!
先把struts做个Introduction吧,正好在介l的同时也给自己一个整理的ZQ看了一天了Q整理一下思\吧!
首先讲到strutsQ就不能不提Model 2Q讲到Model 2׃能不提到Model 1Q?IMG height=19 src="http://www.aygfsteel.com/Emoticons/51_51.gif" width=19 border=0>Q,其实Q这三者都M开一个东西,是java中web application里面的最基本也是最重要的东西,servletQ不错,我认为它是个基础Q个人看?)Qservlet是个好东西,sun公司认ؓ有两U类型的web applicationQ?、Presentation-oriented 2、Service-oriented。随着Web被逐渐用于deliver serviceQ那些service providers逐渐认识到在Web中提供动态内容的重要性。随之出CCGI。CGI的缺Ҏ׃说啦Q其实我没大用过CGIQ汗一个!不过据说是有很多~点的,比如q_相关性,lack of scalability。于是servlet适时而出了!
关于servlet的细节我׃具体提了Q我也有待学习,q里之所以提到servletQ是因ؓstruts中的一个核心部件就是一个servletQ所以在q里单提一下servletQ以供读者检查自己是否应该先M解一下servlet。Model 1单讲是只用JSPQ而不用servletQ这里的用与不用Q仅是对web开发h员而言Q因为JSP最l还是会被translate为servletQ这里用translate是遵照官方用词,国内很多书翻为编译,个h认ؓ不是很恰当)。其实出现Model 1的原因也很简单,因ؓ用servlet来构造一个网不胜其烦,一堆的out.pringln(...)让h整个感觉是手工构造一个网,在这个所见即所得的今天Q我们可能永q无法想象它的繁琐性!于是出现了JSPQ把那些工作交给了web containerQ我们只需用所见即所得的tool构造webQ然后在web中适当的地方加入java代码卛_。好Q点Cؓ止,再具体就是jsp的内容了。但后来Z发现Q完全抛弃servletq不是一个好的ideaQ其中的一个关键问题就是content与presentationh在一P非常不利于维护和修改。于是h们又提出了结合jsp与servlet来开发webQ这是Model 2Q它本质上是l典MVC模式的一个变U。这里推荐一文?A href="http://http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html">Understanding JavaServer Pages Model 2 architecture Q专门介lModel2的,希望对大家有所帮助Q这也是struts官方|站上推荐的一文章!׃我们的主题是strutsQ所以我们就不细谈这文章了?BR>当然我也希望读者对MVC模式有所了解Q如果否Q请?A >MVC的源头。了解一下它吧,一个很好的东东Q?BR>好,准备东西讲完了,我们下面开始看strutsQ?BR>struts从结构上讲是W合Model2的,先简单介l一下它的情况,它的目的是要解决Model 1中的flow control的问题,q得内容(ModelQ与表现QViewQ彻底分RStruts是在2000q?月由Craig R. McClanahan发v的。ƈ?001q?月发布了1.0版?休息一下)


]]>
Eclipse(3.1) Plugin Framework(ZOSGI的Plugin Architecture) (转自Programmer's LifeQ?/title><link>http://www.aygfsteel.com/linq/archive/2005/12/30/26106.html</link><dc:creator>未来刀?/dc:creator><author>未来刀?/author><pubDate>Fri, 30 Dec 2005 11:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/linq/archive/2005/12/30/26106.html</guid><wfw:comment>http://www.aygfsteel.com/linq/comments/26106.html</wfw:comment><comments>http://www.aygfsteel.com/linq/archive/2005/12/30/26106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/linq/comments/commentRss/26106.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/linq/services/trackbacks/26106.html</trackback:ping><description><![CDATA[<P><FONT style="BACKGROUND-COLOR: #ffa500"><FONT color=#800080 size=5><STRONG>概述</STRONG></FONT><BR></FONT>Eclipse中最出彩的部分莫q于它的Plugin FrameworkQ可以说Eclipse在一定程度上使得Plugin机制得以行Q当ӞEclipse的优势不仅仅在此Q但正因为采用了Plugin机制QEclipse才得以被不断的扩充,来强大。一直以来就惛_析Eclipse的Plugin FrameworkQ由于各U原因一直耽搁Q刚好这个周末没什么事Q下定决心对其进行了研究和分析,Ҏ很原始,是对Eclipse的启动过E进行分析,Z的是Eclipse 3.1的版本,分析q程׃在这说了Q主要是说说分析出来的心得?BR>架构上来讲Eclipse基本采用的是Kernel+Core Plugins+Custom Plugins的结构体p,除了Kernel部分外均为PluginQ所以可UCؓall are pluginsQ凡是Plugin的部分都是可被替换的?/P> <P><FONT style="BACKGROUND-COLOR: #ffa500" color=#800080 size=5><STRONG>OSGI</STRONG></FONT><BR>Eclipse 3.0后采用的是OSGI来作为其Plugin Architecture实现的依据,鉴于此就得简单提提OSGI了,主要从Plugin的角度来分析OSGIQOSGI概念中主要分ZBundle和ServiceQ可以认为Bundle是一个模块的理器,主要是通过BundleActivator理模块的生命周期,而Service则是q个模块可暴露对外的服务对象Q这里体COSGI和传l的Plugin Framework不同的一个地方,理和静态结构分开Q在OSGI中通过在manifest.mf文g中增加一些内Ҏ发布BundleQ在其中描述了Bundle的提供商、版本、唯一ID、classpath、暴露对外的包、所依赖的包Q每个Bundle拥有自己的ClassLoader以及contextQ通过context可进行服务的注册、卸载等Q这些操作都会通过事g机制q播l相应的其他的BundleQ一般来说都为通过在Bundle中编写初始需要注册的服务的方法来完成Bundle可供外部使用的服务的暴露功能Q如需要调用其他Plugin提供的服务可通过context的getServiceReference先获取Service的句柄,再通过context.getService(ServiceReference)的方法获取Service的实体?/P> <P><FONT style="BACKGROUND-COLOR: #ffa500" color=#800080 size=5><STRONG>Eclipse Plugin定义<BR></STRONG></FONT>Eclipse中的Plugin的概念ؓ包含一pd服务的模块即Z个Plugin。既然是遵@OSGI的,也就意味着Plugin通常是由Bundle和N多Service共同构成的,在此基础上Eclipse认ؓPlugin之间通常存在两种关系Q一Uؓ依赖Q一Uؓ扩展Q对于依赖可通过OSGI中元描述信息里添加需要引用的Plugin卛_实现Q但扩展在OSGI中是没有定义的,Eclipse采用了一个Extension Point的方式来实现Plugin的扩展功能?BR>l合OSGI<BR>Eclipse遵@OSGI对于Plugin的ID、版本、提供商、classpath、所依赖的plugin以及可暴露对外的包均在manifest.mf文g中定义?BR>Plugin Extension Point<BR>对于扩展QEclipse采用Extension Point的方式来实现Q每个Plugin可定义自qExtension PointQ同时也可实现其他Plugin的Extension PointQ由于这个在OSGI中是未定义的Q在Eclipse中仍焉过在plugin.xml中进行描qͼ描述的方法ؓ通过<extension-point id="" name="" schema="">的Ş式来定义Plugin的扩展点Q通过<extension point="">的Ş式来定义实现的其他Plugin的扩展点Q所提供的扩展点通过schema的方式进行描qͼ详细见eclipse extension-point schema规范Qؓ了更好的说明扩展点这个概念,举例如下Q如工具栏就是工hPlugin提供的一个扩展点Q其他的Plugin可通过此扩展点d按钮臛_h中,q可相应的添加按钮所对应的事?当然Q此事g必须实现工具栏Plugin此扩展点所要求的接?Q工h的Plugin通过callback的方式来相应的响应按钮的动作。可见通过Extension Point的方式可以很好的提供Plugin的扩展方式以及实现扩展的方式?/P> <P><FONT style="BACKGROUND-COLOR: #ffa500" color=#800080 size=5><STRONG>Eclipse Plugin Framework</STRONG><BR></FONT>那么Eclipse是如何做到Plugin机制的实现的呢?Q还是先讲讲Eclipse的设计风|Eclipse在设计时有个重要的分层法则,卌a层相兛_语言层无关的代码分开(如jdt.core和core)Q核心与UI分开(如workbench.ui和workbench.core)q两个分层法则,q个在Eclipse代码中处处可见,在Plugin Framework部分也充分得体现了这个,遵@OSGIQEclipse首先是实C一个OSGI ImplQ这个主要通过它的FrameWork、BundleHost、ServiceRegistry、BundleContextImpl{对象来实现Q如果关心的话大家可以看看这部分的代码,实现了Bundle的安装、触发、卸载以及Service的注册、卸载、调用,在Plugin机制上Eclipse采用的ؓlazy load的方式,卛_调用时才q行实际的启动,采用的ؓ句柄/实体的方式来实现Q外部则通过OSGIq行启动、停止等动作Q各Plugin则通过BundleContext来进行服务的注册、卸载和调用Q这是OSGI的部分实现的单介l?BR>那么Extension Point斚wEclipse是如何实现的呢,在加载PluginӞEclipse通过对plugin.xml的解析获取其中的<extension-point>节点?lt;extension>节点Qƈ相应的注册到ExtensionRegistry中,而各个提供扩展点的Plugin在提供扩展点的地方进行处理,如工hPlugin提供了工h的扩展点Q那么在构成工具栏时Plugin通过Platform.getPluginRegistry().getExtensionPoint(扩展点ID)的方法获取所有实现此扩展点的集合IExtensionPoint[]Q通过此集合可获取IConfigurationElement[]Q而通过q个可以获?lt;extension point="">其中的配|,同时q可通过IConfigurationElement创徏回调对象的实例,通过q样的方法Eclipse也就实现了对于Plugin的扩展以及扩展的功能的回调。在Plugin Framework中还涉及很多事g机制的用,比如Framework的事件机Ӟ以便在Bundle注册、Service注册的时候进行通知?/P> <P><FONT style="BACKGROUND-COLOR: #ffa500" color=#800080 size=5><STRONG>ȝ</STRONG></FONT><BR>通过对Eclipse启动q程的分析,可清晰的看到Eclipse Kernel+Core Plugins+Application Plugins的方式,在代码中分别对应为loadBasicBundles和registerApplicationServicesQloadBasicBundles通过加蝲config.ini中的osgi.bundles完成基本的bundles的加载,ȝ看这个配|会发现是org.eclipse.core.runtimeq有一个updateQcore.runtime又会通过IDEApplication来完成整个Eclipse的启动,同时会注册所有与workbench相关的plugin?BR>Eclipse׃以前版本的Plugin Framework是没有采用OSGI的,所以通过EclipseAdaptor的方式来实现与以往的兼容,目前新的Plugin采用的方式基本就是manifest.mf描述Plugin OSGI部分的信息,Plugin.xml描述扩展点的信息?BR>Eclipse中有非常多优U的设计,q个在看它的代码时会有很q感触Q比如Contributing to Eclipse中提到的Extension Object/Interface的设计,实是非常的不错Q虽然看C可能觉得很简单,关键是要惛_到ƈ合适的M用?BR>ȝ陈词Q^_^QEclipse Plugin Framework是采用OSGI Impl+Plugin Extension-Point的方式来共同实现的,实现了Plugin的部|Ӏ编写、独立的Classloader和Context、Plugin中Service的注册、Plugin中Service的调用、Plugin的依赖、Plugin的扩展、Plugin生命周期的管理?/P> <P><FONT style="BACKGROUND-COLOR: #ffa500" color=#800080 size=5><STRONG>带来的思?BR></STRONG></FONT>Eclipse Plugin Framework采用的是OSGI的实玎ͼ一定程度上我们也能看到OSGI的优点,那么JMX+IoC方式的Plugin Framework与其的比较又是在哪些斚w呢?Eclipse Plugin Framework不的地方又在哪里呢Q哪些地方值得改进呢?</P><img src ="http://www.aygfsteel.com/linq/aggbug/26106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/linq/" target="_blank">未来刀?/a> 2005-12-30 19:05 <a href="http://www.aygfsteel.com/linq/archive/2005/12/30/26106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">μԴ</a>| <a href="http://" target="_blank">¹Ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">°Ͷ</a>| <a href="http://" target="_blank">찲</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¦</a>| <a href="http://" target="_blank">¬</a>| <a href="http://" target="_blank">пǰ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank">Ӣ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>