﻿<?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-学海无涯，你我同行！-随笔分类-技术随笔</title><link>http://www.blogjava.net/linq/category/6500.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 21:33:06 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 21:33:06 GMT</pubDate><ttl>60</ttl><item><title>解读Struts</title><link>http://www.blogjava.net/linq/archive/2006/02/18/31416.html</link><dc:creator>未来刀客</dc:creator><author>未来刀客</author><pubDate>Sat, 18 Feb 2006 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/linq/archive/2006/02/18/31416.html</guid><wfw:comment>http://www.blogjava.net/linq/comments/31416.html</wfw:comment><comments>http://www.blogjava.net/linq/archive/2006/02/18/31416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linq/comments/commentRss/31416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linq/services/trackbacks/31416.html</trackback:ping><description><![CDATA[开学第一周在匆匆忙忙的脚步中过去了！下了一周的雨也终于停了，第一个周末，也没什么大事情，就拿struts来开开涮吧！<BR>说干就干！因为自己以前已经看过一点struts，并且做过一个小例子（记得以前好像有个wizard，就是教你一步步用struts<IMG height=19 src="http://www.blogjava.net/Emoticons/75_75.gif" width=19 border=0>）。但还没有深入它的代码，对它的流程当时了解过，不过现在忘了<IMG height=19 src="http://www.blogjava.net/Emoticons/cry_smile.gif" width=19 border=0>，唉，岁月不饶人，不服老不行，看着记性！<BR>先把struts做个Introduction吧，正好在介绍的同时也给自己一个整理的机会，看了一天了，整理一下思路吧！<BR>首先讲到struts，就不能不提Model 2，讲到Model 2就不能不提到Model 1（<IMG height=19 src="http://www.blogjava.net/Emoticons/51_51.gif" width=19 border=0>），其实，这三者都离不开一个东西，就是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适时而出了！<BR>关于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模式的一个变种。这里推荐一篇文章<A href="http://http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html">Understanding JavaServer Pages Model 2 architecture </A>，专门介绍Model2的，希望对大家有所帮助，这也是struts官方网站上推荐的一篇文章！由于我们的主题是struts，所以我们就不细谈这篇文章了。<BR>当然我也希望读者对MVC模式有所了解，如果否，请看<A href="http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html">MVC</A>的源头。了解一下它吧，一个很好的东东！<BR>好，准备东西讲完了，我们下面开始看struts！<BR>struts从结构上讲是符合Model2的，先简单介绍一下它的情况，它的目的就是要解决Model 1中的flow control的问题，并使得内容（Model）与表现（View）彻底分离。Struts是在2000年5月由Craig R. McClanahan发起的。并在2001年7月发布了1.0版。(休息一下）<BR><img src ="http://www.blogjava.net/linq/aggbug/31416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linq/" target="_blank">未来刀客</a> 2006-02-18 21:06 <a href="http://www.blogjava.net/linq/archive/2006/02/18/31416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture) (转自Programmer's Life）</title><link>http://www.blogjava.net/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.blogjava.net/linq/archive/2005/12/30/26106.html</guid><wfw:comment>http://www.blogjava.net/linq/comments/26106.html</wfw:comment><comments>http://www.blogjava.net/linq/archive/2005/12/30/26106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linq/comments/commentRss/26106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/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中最出彩的部分莫过于它的Plugin Framework，可以说Eclipse在一定程度上使得Plugin机制得以流行，当然，Eclipse的优势不仅仅在此，但正因为采用了Plugin机制，Eclipse才得以被不断的扩充，越来越强大。一直以来就想分析Eclipse的Plugin Framework，由于各种原因一直耽搁，刚好这个周末没什么事，下定决心对其进行了研究和分析，方法很原始，就是对Eclipse的启动过程进行分析，基于的是Eclipse 3.1的版本，分析过程就不在这说了，主要是说说分析出来的心得。<BR>架构上来讲Eclipse基本采用的是Kernel+Core Plugins+Custom Plugins的结构体系，除了Kernel部分外均为Plugin，所以可称为all are plugins，凡是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的角度来分析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的实体。</P>
<P><FONT style="BACKGROUND-COLOR: #ffa500" color=#800080 size=5><STRONG>Eclipse Plugin定义<BR></STRONG></FONT>Eclipse中的Plugin的概念为包含一系列服务的模块即为一个Plugin。既然是遵循OSGI的，也就意味着Plugin通常是由Bundle和N多Service共同构成的，在此基础上Eclipse认为Plugin之间通常存在两种关系，一种为依赖，一种为扩展，对于依赖可通过OSGI中元描述信息里添加需要引用的Plugin即可实现，但扩展在OSGI中是没有定义的，Eclipse采用了一个Extension Point的方式来实现Plugin的扩展功能。<BR>结合OSGI<BR>Eclipse遵循OSGI对于Plugin的ID、版本、提供商、classpath、所依赖的plugin以及可暴露对外的包均在manifest.mf文件中定义。<BR>Plugin Extension Point<BR>对于扩展，Eclipse采用Extension Point的方式来实现，每个Plugin可定义自己的Extension Point，同时也可实现其他Plugin的Extension Point，由于这个在OSGI中是未定义的，在Eclipse中仍然通过在plugin.xml中进行描述，描述的方法为通过&lt;extension-point id="" name="" schema=""&gt;的形式来定义Plugin的扩展点，通过&lt;extension point=""&gt;的形式来定义实现的其他Plugin的扩展点，所提供的扩展点通过schema的方式进行描述，详细见eclipse extension-point schema规范，为了更好的说明扩展点这个概念，举例如下，如工具栏就是工具栏Plugin提供的一个扩展点，其他的Plugin可通过此扩展点添加按钮至工具栏中，并可相应的添加按钮所对应的事件(当然，此事件必须实现工具栏Plugin此扩展点所要求的接口)，工具栏的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机制的实现的呢？？还是先讲讲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的部分实现的简单介绍。<BR>那么Extension Point方面Eclipse是如何实现的呢，在加载Plugin时，Eclipse通过对plugin.xml的解析获取其中的&lt;extension-point&gt;节点和&lt;extension&gt;节点，并相应的注册到ExtensionRegistry中，而各个提供扩展点的Plugin在提供扩展点的地方进行处理，如工具栏Plugin提供了工具栏的扩展点，那么在构成工具栏时Plugin将通过Platform.getPluginRegistry().getExtensionPoint(扩展点ID)的方法获取所有实现此扩展点的集合IExtensionPoint[]，通过此集合可获取IConfigurationElement[]，而通过这个就可以获取&lt;extension point=""&gt;其中的配置，同时还可通过IConfigurationElement创建回调对象的实例，通过这样的方法Eclipse也就实现了对于Plugin的扩展以及扩展的功能的回调。在Plugin Framework中还涉及很多事件机制的使用，比如Framework的事件机制，以便在Bundle注册、Service注册的时候进行通知。</P>
<P><FONT style="BACKGROUND-COLOR: #ffa500" color=#800080 size=5><STRONG>总结</STRONG></FONT><BR>通过对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。<BR>Eclipse由于以前版本的Plugin Framework是没有采用OSGI的，所以通过EclipseAdaptor的方式来实现与以往的兼容，目前新的Plugin采用的方式基本就是manifest.mf描述Plugin OSGI部分的信息，Plugin.xml描述扩展点的信息。<BR>Eclipse中有非常多优秀的设计，这个在看它的代码时会有很深的感触，比如Contributing to Eclipse中提到的Extension Object/Interface的设计，确实是非常的不错，虽然看到你可能觉得很简单，关键是要想得到并合适的去使用。<BR>总结陈词，^_^，Eclipse 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与其的比较又是在哪些方面呢？Eclipse Plugin Framework不足的地方又在哪里呢？哪些地方值得改进呢？</P><img src ="http://www.blogjava.net/linq/aggbug/26106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linq/" target="_blank">未来刀客</a> 2005-12-30 19:05 <a href="http://www.blogjava.net/linq/archive/2005/12/30/26106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>