yuping322

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与

留言簿(2)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2007年8月 (10)

搜索

  •  

最新评论

阅读排行榜

  • 1. [导入] xml文件解析-DOM4J (534)
  • 2. [导入]ext 学习笔记(471)
  • 3. [导入]OSGI学习(386)
  • 4. [导入]Java中类与类的关系(377)
  • 5. [导入]信息采集系统的技术实现(366)

评论排行榜

  • 1. [导入]信息采集系统的技术实现(0)
  • 2. [导入]行业搜索、垂直搜索(0)
  • 3. [导入]Web数据挖掘(0)
  • 4. [导入]ext 学习笔记(0)
  • 5. [导入]掌握JDK1.5枚举类型(0)

Powered by: 博客园
模板提供:沪江博客
BlogJava | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

2007年8月20日

[导入]信息采集系统的技术实现

网站:JavaEye 作者:yuping322 发表时间: 2007-08-24 20:26 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/116248

信息采集系统的技术实现


        信息采集系统指的是按标准格式采集指定网络信息,同搜索引擎的区别在于其采集的目的性更强,采集源范围也比较小。这里简单介绍一下信息采集系统实现上的几个关键问题:


1) 采集网页数据

        VC,Java,VB的网络通讯功能都足够实现信息采集,VC中的Get/Post方式可采集网页信息,也可以直接用socket方式采集,但一般用前一种模式,另外为了提高采集效率都采用多线程技术,在网上的一些Spider程序都是多线程的,可以借鉴.


2) 如何按关键字来信息

        信息采集的一大特点是按多个关键字将信息拆分出来,例如供求信息中的商机标题、联系人、电话、Email、内容等,实现时需要事先定义好这些关键字,然后在网页中搜索,将夹在两个关键字当中的信息采集出来,另外还要注意,网页中的许多关键字是包含空格的,空格数量也不能确定,例如"邮   件",这就要求在查找关键字时要把关键字按单个汉字拆开来匹配,遇到中间的空格要跳过去.这一步实现了,信息就会变的非常有规则,也就可以导入本地库了.


3) 网页中的链结获取算法

        了解HTML的应该清楚,网页中的链结都是通过的标签定义的,但也会分很多情况,例如:  < a href = "...">  这是常见的链结格式,但要注意采集出来的链结可能是完整的http://...,也可能是相对路径,要分别处理;  < a href = ''> 用单引号分隔的,所以用算法获取链结的时候要根据双引号和单引号两种标记来分隔;< a href = .. onclick = javascript:view('..','')> 通过javascript的函数处理链结,算法上就麻烦了许多。


4) 无效数据的过滤

        即使通过关键字的方式摒弃了许多广告信息,但在关键字信息中也会有不少无效数据,包括一些信息开头的空格


5) 特定数据的获取算法

        Email,电话等数据符合一定的规范,一般可以用一些算法提取出来,也可以用正则表达式技术来获取,在网络上有不少此类算法.在信息采集中,Email和电话等关键信息是比较分散的,需要用提取算法把这些信息提取出来放在正确的位置.这是非常有必要的,因为信息采集系统往往会有邮件群发的功能.


信息采集的整个流程可总结如下:


 a) 首先,获取网页的完整信息

 b) 用算法获取网页中的正文信息,即抛弃HTML的标签文本

 c) 去除多余的空行

 d) 按定义好的关键字将信息分隔开

 e) 对信息进行无效数据过滤

 f) 信息入本地库

 g) 获取网页中的链结,对该链结从a)步骤开始重复,但注意网页中的许多链结是广告或无效的,因此要事先定义好一些链结关键字,只有包含关键字的链结才处理




《 信息采集系统的技术实现 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/116248
posted @ 2007-08-24 20:26 fengzhi 阅读(366) | 评论 (0) | 编辑 收藏
 
[导入]行业搜索、垂直搜索

网站:JavaEye 作者:yuping322 发表时间: 2007-08-24 20:05 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/116244

行业搜索、垂直搜索引擎。


行业搜索:搜索对象针对所在的行业,采用类似传统通用搜索引擎的分词索引技术,返回关键词最匹配的结果。


垂直搜索:搜索对象针对所在的行业,采用数据采集、数据挖掘、数据整理等技术,返回经过加工处理的结果。


一、综合搜索


酷讯www.kooxoo.com :招聘、房产、汽车、火车票、机票、餐饮、交友、购物、旅游


奇虎www.qihoo.com :论坛、博客、新闻、招聘、房产、视频、音乐、图片、火车票、餐饮、经验?、折扣


cgogo搜个够www.cgogo.com :社区、招聘、票务、住房、视频、本地(地图)、博客、无线


我酷网 www.wooqoo.com                  (五花八门,该有都有)


开拓搜索www.kaitoo.com                  (五花八门,该有都有)


每步搜索 http://cnc.meibu.com/ (综合)


八百搜www.800so.com (五花八门,该有都有,站内搜索和站外搜索并列)


酷爱 www.koooi.com (网页 MP3 房产 餐饮 交友 搜人 资源)


soso88   www.soso88.net (政府采购 人才职位 房源地产 建材装饰)



二、求职招聘: (18)


职友集   www.jobbui.com


搜职网  www.globehr.com


南京搜职网  www.sozhi.cn


托托搜索 www.totojob.com


1010job精英招聘 www.1010job.com


牛耳搜职网 www.newerjob.com


数字英才(职通车) www.01hr.com


深度搜索 www.deepdo.com


淘职网 www.go2work.com.cn


我搜网 www.alsox.com


校园招聘 www.zhaopinbbs.com


易聘  www.yipin.cc


找工作 www.meijob.com


热职工作引擎 www.rezhi.com


职场快线 www.jobems.com


职脉搜索 www.jobmet.com


高八斗 www.gao8dou.com         区域搜索引擎联合,在各地都有独立一级域名,单一数据库。


安徽人才总网 www.ah668.com/rc/ (安徽区域搜索)





三、房屋房产 (9)


搜房引擎 search.soufun.com


房老大 www.fanglaoda.com


焦点房产seek.focus.cn


家家看网 www.jjto.com


我住网 www.wozhu.com


搜房网 www.sofang.com.cn


寻捕房 www.xpfang.com



房网搜索 www.house163.com


百房 www.100fang.com




四:商务商机、人文 (20)


联络家  http://www.linkist.com/


优库  www.ucloo.com        (搜人 公司 学校 )


Anyso商业搜索引擎  www.anyso.com


accoona  www.accoona.cn


国通网 www.guton.com


享者  www.hengzhe.com


品搜 www.pinsou.com


品通 www.joingoo.com


搜商 www.bseek.cn


商搜 www.shangsou.com


商宝 www.b2b8.com


jow  http://jqw.com/


企业门户 www.yie.cn


搜库网 www.souku.com.cn


伊索  http://china.eceel.com/


天网商搜 http://china.eceel.com/


信援 www.xinsos.com


一呼百应 www.youboy.com


易购搜索 www.ego321.com


浙搜 http://zhesou.com/ (区域性搜索)


五、生活、购物消费 (17)


8848(比较购物)http://esearch.8848.com/


丫丫比较购物 http://askyaya.com/


大拿网(比较购物) http://www.danawa.com.cn/


普加 Pojaa http://www.pojaa.com/




搜狗 http://shopping.sogou.com/


购物搜索www.gobygo.com

中搜
http://shopping.zhongsou.com/


Soaso http://www.soaso.com/


搜评网 http://www.souping.com/


无忧城市网 http://www.51city.com


亿起搜  http://www.eqiso.com/


365.com  www.365.com (生活搜索综合)


快搜测评网 www.ksou.com.cn (IT硬件相关)


搜教网 www.soojoo.cn (教育资源相关)


乐逊外卖搜索 www.lexun.com.cn


友买网 www.uobuy.com


马可波罗 www.makepolo.com/


易购搜索 www.ego321.com



六、地图公交、出行 (15)


公交查询 http://www.8684.cn/


瘦驴旅游搜索引擎  http://www.souluu.com/


E都市 http://www.edushi.com/


Mapabc地图 http://www.mapabc.com/


图吧  http://main.mapbar.com/


UUMAP http://www.uumap.com/


城市通 http://www.52tong.com/


华夏图网 http://www.map2china.com/


都市圈-三维地图 http://www.o.cn/


第1搜 http://www.d1so.com/


都市吧 http://www.city8.com/


活图网 http://www.livemap.cn/


我要地图 http://www.51ditu.com/


丁丁地图 www.ddmap.com


坐车网 http://www1.zuoche.com/ (广州区域搜索)


google、百度、搜狗、MSN虚拟地球http://virtualearth.msn.com/


七、医疗健康


康Q www.kangq.com


Souvv http://search.souvv.com/


医搜 http://www.yiso.cc/


放心医苑网 http://www.120so.com/


博睿  http://search.chinamtcm.com


八、图书搜索


爱搜书网 http://www.isoshu.com/


读秀知识库 http://www.duxiu.com/



九、分类信息


国通网http://www.guton.com



十、手机搜索引擎


悠悠村  http://www.uucun.com/


儒豹手机搜索 http://www.roboo.com/




十一、软件IT、BT资源


迅雷资源搜索 http://so.xunlei.com


BT联盟搜索引擎 http://search.btchina.net/


BT全球搜索 http://bt.it.com.cn/


BT特工 http://bt.souyo.com/


飞客BT搜索 http://bt.fkee.com/


天天BT 电影 http://www.ttbt.cn/


网游搜索 www.37ss.com


FTP搜索引擎 www.tooooold.com



十二、娱乐综合、电影、音乐等


搜刮  http://www.sogua.com/


易搜 http://bt.souyo.com/               (娱乐综合、软件IT、游戏、电影)


狗载社区 http://www.ppgou.com/

OpenV开放视频 http://www.openv.tv/


第九频道 www.tvix.cn


动漫搜索 http://share.greedland.net/


奇客网 http://v.qirss.com/


CCTV视频搜索 http://vsearch.cctv.com/


优酷视频搜索  http://www.youku.com/



十三、电视节目


电视猫  www.tvmao.com


e准 - 电视节目预告 www.ezhun.com


搜视网 http://www.tvsou.com/


我爱电视剧 http://www.5idsj.com/ (剧情搜索)



十四、博客、论坛搜索


贴易 http://search.teein.com/


Souyo http://www.souyo.com/


博狗 http://www.blogool.com/


大旗 http://search.chinabbs.com/


博客查号台  http://www.blog114.com.cn/


博搜 http://www.booso.com/


中文RSS搜索 http://www.booso.com/


名人博客 http://www.starlogs.com/


中国博客网搜索 http://search.blogcn.com/



十五、其它


搜农 www.sounong.net (来自安徽的和农业相关综合搜索引擎)


农搜 www.agrisou.com


性搜 http://www.sinsoo.com/


中国建筑黄页 www.agoo.com.cn


搜网(图片搜索) http://home.souwang.com/


金聚网(游戏搜索) http://www.jj160.com/




游戏网(搜索引擎?)http://ks.pcgames.com.cn/


乐虎网(手机图片) http://www.joyhoo.com/


全国驾校搜索 www.jxedt.com

个性搜索       www.deyeb.cn




《 行业搜索、垂直搜索 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/116244
posted @ 2007-08-24 20:05 fengzhi 阅读(206) | 评论 (0) | 编辑 收藏
 
[导入]Web数据挖掘

网站:JavaEye 作者:yuping322 发表时间: 2007-08-24 19:52 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/116243

   引言

数据挖掘(Data Mining,DM)是从大量数据中提取或“挖掘”知识,是从存放在数据库、数据仓库或其他信息库中的大量数据中挖掘有趣知识的过程。[1] 随着网络的不断发展,因特网目前已成为一个巨大的、分布广泛的和全球性的信息服务中心。从海量的网络信息中寻找有用的知识,早已成为人们的迫切需求。各种类似Google、Baidu等的搜索引擎也层出不穷,Web数据挖掘的应用在现实中不断体现。

Web数据挖掘建立在对大量的网络数据进行分析的基础上,采用相应的数据挖掘算法,在具体的应用模型上进行数据的提取、数据筛选、数据转换、数据挖掘和模式分析,最后做出归纳性的推理、预测客户的个性化行为以及用户习惯,从而帮助进行决策和管理,减少决策的风险。

Web数据挖掘涉及多个领域,除数据挖掘外,还涉及计算机网络、数据库与数据仓储、人工智能、信息检索、可视化、自然语言理解等技术。


2   Web数据挖掘面临的问题

Web的巨大、分布广泛和内容多样使得目前的Web挖掘面临着众多问题和挑战。首先,对有效的数据仓库和数据挖掘来说,Web上的数据过于庞大。而且,Web上的数据具有极强的动态性,不仅数量增长快而且更新十分迅速。但是面对如此大量的Web上的信息,有调查却表明:99%的Web信息对于99%的用户是无用的。这样看来,面对网络上形形色色各式各样的用户群体,许多由Web搜索引擎所检索到的资料将会被淹没。

另外,由于Web页面缺乏同一的结构,其结构又比任何传统文本文档都要复杂,所以要实现基于Web的数据挖掘和信息检索在目前来说是非常具有挑战性的。


 


3   Web数据挖掘的分类

Web数据挖掘是一项具有挑战性的课题。它实现对Web存取模式,Web结构和规则,以及动态的Web内容的查找。一般来说,Web数据挖掘可分为四类:Web内容挖掘、Web结构挖掘、Web使用记录挖掘和Web用户性质挖掘。其中,Web内容挖掘、Web结构挖掘和Web使用记录挖掘是Web1.0时代就已经有了的,而Web用户性质挖掘则是伴随着Web2.0的出现而出现的。


3.1 Web内容挖掘

Web内容挖掘主要包括文本挖掘和多媒体挖掘两类,其对象包括文本、图像、音频、视频、多媒体和其他各种类型的数据。这些数据一般由非结构化的数据(如文本) 、半结构化的数据(如HTML 文档) 和结构化的数据(如表格) 构成。对非结构化文本进行的Web挖掘,称为文本数据挖掘或文本挖掘,是Web挖掘中比较重要的技术领域。Web挖掘中另一个比较重要的技术领域是Web多媒体数据挖掘。

目前,关于Web内容挖掘的研究大体以Web文本内容挖掘为主。Web内容挖掘一般从资源查找和数据库两个不同的方面进行研究。

从资源查找的方面来看,Web内容挖掘的任务是从用户的角度出发,怎样提高信息质量和帮助用户过滤信息。主要是对非结构化文档和半结构化文档的挖掘。非结构化文档主要指Web上的自由文本,如小说、新闻等。Web上的半结构化文档挖掘指在加入了HTML、超链接等附加结构的信息上进行挖掘,其应用包括超链接文本的分类、聚类、发现文档之间的关系、提出半结构化文档中的模式和规则等。

从数据库的观点进行Web内容挖掘主要是试图建立Web站点的数据模型并加以集成, 以支持复杂查询,而不只是简单的基于关键词的搜索。这要通过找到Web文档的模式、建立Web知识库来实现。

对文本数据进行挖掘的文档分类和模型质量评价方法与传统的数据挖掘方法相类似,分类算法主要应用朴素贝叶斯(Naive Bayes Classifier)。对模型的质量评价主要有分类的正确率(Classification Accuracy)、准确率( Precision)和信息估值( Information Score)。 SAAS

Web多媒体数据挖掘从多媒体数据库中提取隐藏的知识、多媒体数据关联、或者是其他没有直接储存在多媒体数据库中的模式。多媒体数据挖掘包括对图像、视频和声音的挖掘。多媒体挖掘首先进行特征提取,然后再应用传统的数据挖掘方法进行进一步的信息挖掘。对网页中的多媒体数据进行特征的提取,应充分利用HTML的标签信息。[3]

3.2 Web结构挖掘

由于有用的知识不仅包含在Web页面的内容中,而且也包含在页面的结构中。所以Web结构挖掘是从站点的组织结构和页面结构中推导出知识,对Web页面间的结构进行挖掘,找出数据链的结构进行分类、聚类,从而发现页面间的关系,进而改进搜索引擎的性能。

Web结构挖掘的对象是Web本身的超链接,即对Web文档的结构进行挖掘。Web结构挖掘的基本思想是将Web看作一个有向图,他的顶点是Web页面,页面间的超链就是图的边。然后利用图论对Web的拓扑结构进行分析。常见的算法有HITS ( Hypertext Induced Topic Search) 、PageRank、发现虚拟社区的算法、发现相似页面的算法、发现地理位置的算法和页面分类算法。Web结构挖掘的算法一般可分为查询相关算法和查询无关算法两类。查询相关算法需要为每一个查询进行一次超链分析从而进行一次值的指派;而查询独立算法则为每个文档仅进行一次值的指派,对所有的查询都使用此值。HITS和PageRank分别是查询相关算法和查询独立算法的代表。




3.3 Web使用记录挖掘

Web使用记录挖掘也叫Web日志挖掘或Web访问信息挖掘。它是通过挖掘相关的Web日志记录,来发现用户访问Web页面的模式,通过分析日志记录中的规律,可以识别用户的喜好、满意度,可以发现潜在用户,增强站点的服务竞争力。

Web使用记录数据除了服务器的日志记录外, 还包括代理服务器日志、浏览器端日志、注册信息、用户会话信息、交易信息、Cookie中的信息、用户查询、等一切用户与站点之间可能的交互记录。

Web使用记录挖掘方法主要有以下两种:

(1) 将网络服务器的日志文件作为原始数据,应用特定的预处理方法进行处理后再进行挖掘;

(2) 将网络服务器的日志文件转换为图表,然后再进行进一步的数据挖掘。通常,在对原始数据进行预处理后就可以使用传统的数据挖掘方法进行挖掘。



3.4 Web用户性质挖掘

Web用户性质挖掘是伴随着Web2.0的出现而出现的。基于RSS、Blog、SNS、Tag以及WiKi等互联网软件的广泛应用,Web2.0帮助人们从Web1.0时代各大门户网站“填鸭”式的信息轰炸,过渡到了“人人对话”,每个普通用户既是信息的获取者,也是信息的提供者。[4]面对Web2.0的诞生,Web数据挖掘技术又面临着新的挑战。

如果说Web使用记录挖掘是挖掘网站访问者在各大网站上留下的痕迹,那么Web用户性质挖掘则是要去Web用户的老巢探寻究竟。在Web2.0时代,网络彻底个人化了,它完全允许客户用自己的方式、喜好和个性化的定制服务创造自己的互联网,它一方面给予互联网用户最大的自由度,另一方面给予有心商家有待发掘的高含金量信息数据。通过对Web用户自建的RSS、Blog等Web2.0功能模块下客户信息的统计分析,能够帮助运营商以较低成本获得准确度较高的客户兴趣倾向、个性化需求以及新业务发展趋势等信息。有关Web2.0下的数据挖掘正在进一步的研究中。

相关研究方向

 


4   结束语

Web数据挖掘是当今世界上的热门研究领域,其研究具有广阔的应用前景和巨大的现实意义。目前国内的Web数据挖掘尚处于学习、跟踪和探索阶段。Web数据挖掘有许多问题有待于进一步的研究和深化。Web2.0的出现给Web数据挖掘提出了新的要求。基于Web2.0的数据挖掘目前还处于起步阶段,它必将成为Web数据挖掘中很重要的一个研究领域。




《 Web数据挖掘 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/116243
posted @ 2007-08-24 19:52 fengzhi 阅读(266) | 评论 (0) | 编辑 收藏
 
[导入]ext 学习笔记

网站:JavaEye 作者:yuping322 发表时间: 2007-08-23 09:06 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/115874


Ext,在最开始的时候,是作为YUI的一个扩展存在的,所以那个时候它的名称是YUI.Ext,后来,Ext作为一个独立的项目进行开发,并 不再依赖于YUI,在使用Ext的过程当中,你可以使用Ext-base, Prototype+script.aculo.us,jQuey和YUI四种中的一种,我因为比较习惯使用prototype,所以会选择 Prototype+script.aculo.us的组合。jQuery也是一个写得很优美的框架,没有用过,以后抽空看看代码,应该获益匪浅。
 
Ext官方网站:http://www.extjs.com
JSEclipse:http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_jseclipse
Firebug:http://www.getfirebug.com
 
从Ext的站点上下载最新版本的文件,解压什么的我就不说,我想说一下这个文档的结构:
├─adapter           存放所有adapter的文件夹
├─build               经过压缩(build)过的文件
├─docs               文档
├─examples         DEMO
├─package          按包分类的文件
├─resources        资源文件,包括CSS和一些图片
└─source            源代码
使用过程当中,除非你特别介意JS文件的加载是否影响速度,大可只引入ext-all.js和ext-all.css两个文件,Ext在包管理方面,我觉得应该向Dojo学习下。
 
JS和CSS引入的顺序:
<link rel="stylesheet" type="text/css" href="js/ext/resources/css/ext-all.css" />         必须引入
<link rel="stylesheet" type="text/css" href="js/ext/resources/css/xtheme-aero.css" /> 可选,用来控制主题,并且有其他两个可选值,xtheme-gray.css、xtheme-vista.css。
 
引入JS:按照底层依赖的不同:

Ext Stand-alone:
ext-base.js
ext-all.js (or your choice of files)

Yahoo! UI (.12+):
yui-utilities.js
ext-yui-adapter.js
ext-all.js (or your choice of files)

jQuery (1.1+):
jquery.js
jquery-plugins.js // required jQuery plugins
ext-jquery-adapter.js
ext-all.js (or your choice of files)

Prototype (1.5+) / Scriptaculous (1.7+):
prototype.js
scriptaculous.js?load=effects  (or whatever you want to load)
ext-prototype-adapter.js
ext-all.js (or your choice of files)

把相应的文件引入到HTML的head里后,你就可以写你自己的第一Ext的Demo了。
<script type="text/javascript">
function InitDialog() {
  var dialog = new Ext.BasicDialog("hello-dlg", {
          id: "hello-dialog",
            title: "Hello",
          autoTabs:true,
          width:500,
          height:300,
          shadow:true,
          minWidth:300,
          minHeight:250,
          proxyDrag: true
  });
  dialog.addKeyListener(27, dialog.hide, dialog);
  dialog.addButton('Submit', dialog.hide, dialog).disable();
  dialog.addButton('Close', dialog.hide, dialog);
  
  Ext.ComponentMgr.register(dialog);
}
function OnButtonClick() {
  var dialog = Ext.getCmp("hello-dialog");
  dialog.show();
}
Ext.onReady(InitDialog);
</script>
 
<button onClick="OnButtonClick();">Show</button>
<div id="hello-dlg"></div>             渲染DIV用到的层
这里有四处要注意一下:
id: "hello-dialog", Compoent的ID,有了这个ID才能用ComponentMgr.register来在全局进行注册
Ext.ComponentMgr.register(dialog); 注册组件
var dialog = Ext.getCmp("hello-dialog"); 根据ID来得到组件
Ext.onReady(InitDialog); Ext.onRead是注册一个在整个页面的DOM构建完成会被执行的函数

呵呵,第一个例子就出来了,试试看吧~

 




《 ext 学习笔记 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/115874
posted @ 2007-08-23 09:06 fengzhi 阅读(471) | 评论 (0) | 编辑 收藏
 
[导入]掌握JDK1.5枚举类型

网站:JavaEye 作者:yuping322 发表时间: 2007-08-22 22:35 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/115860

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。 

  1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。 

  2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。 

  3.Enum默认实现了java.lang.Comparable接口。 

  4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”. 

  5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。 

  6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。 

  7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。 

  了解了这些基本特性,我们来看看如何使用它们。 

  1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。 

  for (Color c: Color.values()) 
  System.out.println(“find value:” + c); 


  2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。 

  public enum Color { 
  Red, 
  Green, 
  Blue; 

  /* 
  *定义一个变量表示枚举值的数目。 
  *(我有点奇怪为什么sun没有给enum直接提供一个size方法). 
  */ 
  private static int number = Color.values().length ; 

  /** 
  * 随机返回一个枚举值 
  @return a random enum value. 
  */ 
  public static Color getRandomColor(){ 
  long random = System.currentTimeMillis() % number; 
  switch ((int) random){ 
   case 0: 
    return Color.Red; 
   case 1: 
    return Color.Green; 
   case 2: 
    return Color.Blue; 
   default : return Color.Red; 
  } 
  } 
  }
 

  可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。 

  3.覆载(Override)toString, valueOf方法 

  前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。 

  …. 
  public String toString(){ 
  switch (this){ 
  case Red: 
   return "Color.Red"; 
  case Green: 
   return "Color.Green"; 
  case Blue: 
   return "Color.Blue"; 
  default: 
   return "Unknow Color"; 
  } 
  } 
  …. 

  这时我们可以看到,此时再用前面的遍历代码打印出来的是 

  Color.Red 
  Color.Green 
  Color.Blue 

  而不是 

  Red 
  Green 
  Blue. 

  可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。 

  4.使用构造函数 

  虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。 

  public enum Color { 
  Red("This is Red"), 
  Green("This is Green"), 
  Blue("This is Blue"); 

  private String desc; 

  Color(String desc){ 
  this.desc = desc; 
  } 

  public String getDesc(){ 
  return this.desc; 
  } 

  } 


  这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。 

  要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。 

  5.实现特定的接口 

  我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。 

  6.定义枚举值自己的方法。 

  前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。 

  public enum Color { 
  Red { 
  public String toString(){ 
   return "Color.Red"; 
  } 
  }, 
  Green { 
  public String toString(){ 
   return "Color.Green"; 
  } 
  }, 
  Blue{ 
  public String toString(){ 
   return "Color.Blue"; 
  } 
  }; 
  } 


  从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。 

  总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。  

引自:http://www.it.com.cn/f/edu/053/29/93843.htm






《 掌握JDK1.5枚举类型 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/115860
posted @ 2007-08-22 22:35 fengzhi 阅读(160) | 评论 (0) | 编辑 收藏
 
[导入] xml文件解析-DOM4J

网站:JavaEye 作者:yuping322 发表时间: 2007-08-22 18:10 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/115336

 1.   读取并解析XML文档:
读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。








 

    // 从文件读取XML,输入文件名,返回XML文档

    public Document read(String fileName) throws MalformedURLException, DocumentException {

       SAXReader reader = new SAXReader();

       Document document = reader.read(new File(fileName));

       return document;

    }

 


其中,reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就带表了整个XML。

根据本人自己的经验,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。

 

2.  取得Root节点

读取后的第二步,就是得到Root节点。熟悉XML的人都知道,一切XML分析都是从Root元素开始的。








 

  public Element getRootElement(Document doc){

       return doc.getRootElement();

    }

 


2.2访问节点


List childrenList = elt.elements();


List childrenList = elt.elements("student");


Element eltChild = elt.element("student");


2.3.访问属性


List  attrList = elt.attributes();


Attribute attr = elt.attribute("sn");


String attrValue = elt.attributeValue("sn");


2.4.删除元素和属性


Element eltStu = root.element("student");


root.remove(eltstu);


--------------------------------


etl.remove(elt.attribute("sn"));


3.    遍历XML树


DOM4J提供至少3种遍历节点的方法:

1) 枚举(Iterator)








 

    // 枚举所有子节点

    for ( Iterator i = root.elementIterator(); i.hasNext(); ) {

       Element element = (Element) i.next();

       // do something

    }

    // 枚举名称为foo的节点

    for ( Iterator i = root.elementIterator("foo"); i.hasNext();) {

       Element foo = (Element) i.next();

       // do something

    }

    // 枚举属性

    for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {

       Attribute attribute = (Attribute) i.next();

       // do something

    }


2)递归


递归也可以采用Iterator作为枚举手段,但文档中提供了另外的做法








 

    public void treeWalk() {

       treeWalk(getRootElement());

    }

    public void treeWalk(Element element) {

       for (int i = 0, size = element.nodeCount(); i < size; i++)     {

           Node node = element.node(i);

           if (node instanceof Element) {

              treeWalk((Element) node);

           } else { // do something....

           }

       }

}

 


 

3) Visitor模式

最令人兴奋的是DOM4J对Visitor的支持,这样可以大大缩减代码量,并且清楚易懂。了解设计模式的人都知道,Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。我们来看DOM4J中的Visitor模式(快速文档中没有提供)

只需要自定一个类实现Visitor接口即可。








 

        public class MyVisitor extends VisitorSupport {

           public void visit(Element element){

               System.out.println(element.getName());

           }

           public void visit(Attribute attr){

               System.out.println(attr.getName());

           }

        }

 

        调用:  root.accept(new MyVisitor())


    Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。

    注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。

 

4. XPath支持

    DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择。








 

   public void bar(Document document) {

        List list = document.selectNodes( "//foo/bar" );

        Node node = document.selectSingleNode("//foo/bar/author");

        String name = node.valueOf( "@name" );

     }

 


    例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现:








 

    public void findLinks(Document document) throws DocumentException {

        List list = document.selectNodes(" //a/@href ");

        for (Iterator iter = list.iterator(); iter.hasNext(); ) {

            Attribute attribute = (Attribute) iter.next();

            String url = attribute.getValue();

        }

     }

 


5. 字符串与XML的转换


有时候经常要用到字符串转换为XML或反之,








 

    // XML转字符串

 Document document = ...;

    String text = document.asXML();

// 字符串转XML

    String text = "<person> <name>James</name> </person>";

    Document document = DocumentHelper.parseText(text);

 


6 用XSLT转换XML









 

   public Document styleDocument(

       Document document,

       String stylesheet

    ) throws Exception {

    // load the transformer using JAXP

    TransformerFactory factory = TransformerFactory.newInstance();

    Transformer transformer = factory.newTransformer(

       new StreamSource( stylesheet )

    );

    // now lets style the given document

    DocumentSource source = new DocumentSource( document );

    DocumentResult result = new DocumentResult();

    transformer.transform( source, result );

    // return the transformed document

    Document transformedDoc = result.getDocument();

    return transformedDoc;

}

 


 

7. 创建XML

 一般创建XML是写文件前的工作,这就像StringBuffer一样容易。








 

    public Document createDocument() {

       Document document = DocumentHelper.createDocument();

       Element root = document.addElement(root);

       Element author1 =

           root

              .addElement("author")

              .addAttribute(name, "James")

              .addAttribute("location", "UK")

              .addText("James Strachan");

       Element author2 =

           root

              .addElement("author")

              .addAttribute("name", Bob")

              .addAttribute("location", "US")

              .addText("Bob McWhirter");

       return document;

    }

 


 

8. 文件输出

    一个简单的输出方法是将一个Document或任何的Node通过write方法输出








 

    FileWriter out = new FileWriter( "foo.xml");

    document.write(out);

 


 如果你想改变输出的格式,比如美化输出或缩减格式,可以用XMLWriter类








 

    public void write(Document document) throws IOException {

       // 指定文件

       XMLWriter writer = new XMLWriter(

           new FileWriter( "output.xml" )

       );

       writer.write( document );

       writer.close();

       // 美化格式

       OutputFormat format = OutputFormat.createPrettyPrint();

       writer = new XMLWriter( System.out, format );

       writer.write( document );

       // 缩减格式

       format = OutputFormat.createCompactFormat();

       writer = new XMLWriter( System.out, format );

       writer.write( document );

    }

 





《 xml文件解析-DOM4J 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/115336
posted @ 2007-08-22 18:10 fengzhi 阅读(534) | 评论 (0) | 编辑 收藏
 
[导入]Java中类与类的关系

网站:JavaEye 作者:yuping322 发表时间: 2007-08-21 23:00 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/115876

yaogao@gmail.com

类与类之间存在以下关系:

1、 泛化(Generalization)

很简单,就是我们常说的继承。是说子类获得父类的功能的同时,还可以扩展自己的功能。

如图:

Java代码中表现为:extends 和 implements

2、 依赖(Dependency)

两个相对独立的咚咚(A和B),当A负责构造B时,A与B形成依赖关系,即A使用B。

如图:

Java代码中的表现为局部变量,方法的参数,以及对静态方法的调用

3、 关联(Association)

   两个相对独立的咚咚(A和B),当A对象持有B对象的时候,形成关联关系。

关于分为有两种特殊的形式,聚合(Aggregation)和组合(Composition),聚合和组合只有概念上的区别,在Java中的代码实现上没有区别。

聚合:指的是整体与部分的关系,如图:

组合:表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期,即整体对象不存在,部分对象也将不存在,如图:

Java代码中,表现为成员变量。

4、 总结

在Java中,应该尽量优先使用组合,而不是继承,因为继承会使得类关系过于复杂化,破坏了封装性,使用组合一样可以获得已有类的功能,而且会使新类更加稳固。

实际上,从依赖 -----〉聚合--------〉组合,类与类之间的关系更加紧密,互相之间的影响越来越大,其实我们平常比较少去区分这些关系,而且事实上这东西的定义不太好理解,所以肯定会导致认识上的偏差,所以我们使用这些东西的时候,尽量靠近大家都认同的做法,这样容易让别人理解。

 




《 Java中类与类的关系 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/115876
posted @ 2007-08-21 23:00 fengzhi 阅读(377) | 评论 (0) | 编辑 收藏
 
[导入]OSGI学习

网站:JavaEye 作者:yuping322 发表时间: 2007-08-20 14:25 此文章来自于 http://www.JavaEye.com
声明:本文系JavaEye网站原创文章,未经JavaEye网站或者作者本人书面许可,任何其他网站严禁擅自发表本文,否则必将追究法律责任!
原文链接: http://yuping.javaeye.com/blog/115875

OSGI官方网站

http://www.osgi.org/

OSGI组织成员

Aplix Corporation BenQ BMW Group Computer Associates Deutsche Telekom AG Electricit?de France (EDF) Ericsson Mobile Platforms AB Esmertec Espial Group, Inc. ETRI Electronics and Telecommunications Research Institute Gatespace Telematics AB Harman/Becker Automotive Systems GmbH Hitachi, Ltd. IBM Corporation Industrial Technology Research Institute Insignia Solutions Intel Corporation KDDI R&D Laboratories, Inc. KT Corporation Mitsubishi Electric Corporation Motorola, Inc. NEC Corporation Nokia Corporation NTT Oracle Corporation ProSyst Software GmbH Robert Bosch Gmbh Samsung Electronics Co., Ltd. Siemens AG Sprint Sun Microsystems, Inc. Telcordia Technologies, Inc. Telefonica I+D Vodafone Group Services Limited

OSGI的特点

1。JRE版本无关性。虽然Java一直被人们认为是“Write Once, Run Anywhere”,但对于许多大型项目并非如此,常常因为不同JRE之间的一些小差别而花费巨大,被人们戏称为“Write Once,Debug Anywhere”。OSGi首先希望能消除这种无关性,因此它提供给人们一个比JRE更稳定的承诺。

2。嵌入式设备的开发平台。OSGi创立之初的方向是瞄准了J2ME,可以看到委员会成员多数都不是软件企业。倒是Moto和Nokia这类企业非常热心。

3。高于package的完整的组件形式,还包括自从有组件开发以来一直困扰人们的组件版本问题。(这个可不是jar包啊,jar包只是bundle的一种实现­方式。)

4。推迟发生的依赖关系。当组件A(例如含有菜单的窗体)依赖于组件B(例如菜单所表达的一个功能)时,在语言级上必须先有B再有A,但显示中往往是先有A再有­B,所以OSGi为它们提供一种运行时后绑定的机制。

5。新的软件架构。OSGi几乎每个成员都是其所在领域的TOP,这些领域也都是在未来的数十年中软件大行其到的地方,软件商们(比如IBM)希望这些领域的软­件架构能够统一一些,甚至是组件可以通用。

OSGi: Eclipse的根基

OSGi为网络服务提供了一套标准的, 面向组件的规范. 而网络服务又是SOA(Service Oriented Architecture)的基础. 使用OSGI平台, 就可以很轻松的管理软件组件的生命周期, 这组件是可以位于网络中的任何设备上, 而且组件可以动态的安装, 加载, 升级和卸载, 而不用终止和重启设备. 这里的组件是指程序库或者是应用程序, 它们又可以动态的使用别的库和程序.

其实OSGi原本是为了解决家庭网络或者嵌入式设备由于本身的限制(CPU, 内存, 带宽等)而出的一个解决方案, 是一个轻量级的框架. 但现在OSGi已经远远的超过了它的原来的的功能. OSGi已经应用于移动通讯, 汽车, 电信, 嵌入设备, PC桌面和服务器等众多领域. 由于它的开放和简单的风格, 吸引越来越多的著名公司加入, 使OSGi也愈加强大和开放.

我不了解OSGi在其他领域的应用, 只是由于要使用Eclipse, 所以也只对OSGi在PC桌面方面的应用做了些熟悉和了解. 和OSGi一样, Eclipse也是个开放的平台, 它的基础就是OSGi服务平台(Services Platform), 架构在OSGi上的Eclipse具有融合其他应用和组件的能力, 使不同的组件能够运行在一个JVM(Java Virtual Machine)上, 使它们之间能够协同工作, 占用较少得内存和CPU时间, 而且能够由平台管理组件的全生命周期的活动, 可以说一切都在控制之中.

在OSGi中, 每个具体的组件都要继承于Bundle, Bundle是个接口, 定义了安装, 升级, 卸载, 启动, 停止等操作. 其实, 在Eclipse中, 插件(即上面所说的组件)并不是从Bundle继承的, 而是从另外一个重要接口BundleActivator继承的. 后者只有两个接口函数-Start和Stop. 从它的名称就可以看出, 它其实是一个控制Bundle的类. 在Eclipse中有大量这样的应用, 一个类负责提供接口满足不同的需要, 而有另外一个类负责操作这个类. 比如IWorkbench和WorkbenchAdvisor, IWorkbenchWindow和WorkbenchWindowAdvisor等, 这样可以避免客户直接和核心类打交道, 也减轻了客户的负担。

在Eclipse中, 组件都是以Plugin形式存在的, 几乎每个组件都要有一个类实现(继承)Plugin类(也有例外), 一般都是由Plugin来控制服务的加载和卸载, 因为Plugin继承于BundleActivor. 除了Bundle, BundleActivor外, OSGi也提供了BundleEvent, BundleListner等接口. 这些比较简单.

另外一个重要的接口是BundleContext, 该接口提供了一个Bundle所需要的上下文环境, 一个Bundle对应一个BundleContext, 当Bundle停止(Stop)时, 它也就销毁了. BundleContext提供注册服务工厂(ServiceFactory)的接口, Bundle可以注册一些服务工厂接口, 这样其他的Bundle就可以通过实现这些接口达到扩展的目的. 在Eclipse中对应的概念是”扩展点(IExtensionPoint)”和”扩展(IExtension)”. Bundle之间的交互是非常重要的, 利用这种技术, 就可以将很大的项目分成多个Bundle, 然后搭积木就可以了.

eclipse 3.0并没有用OSGI替换掉原来的PlugIn机制。它只是做了与标准兼容的工作:给用户提供了一系列的API来访问,在这个过程中,就必须要做一些改变(比如plugin registry和loading机制)来同OSGI标准完全兼容。最初的Plugin核心只支持静态的扩展,就是说,如果要改变一个已经存在的Plug就必须重启core,也就是要退出Eclipse并重启。

有很多人问Eclipse为什么要兼容OSGI规范而不是其他的规范呢?

在Eclipse被捐赠出来以前,Eclipse由OTI来开发,其目标是开发一个嵌入式Java软件的开发平台。互联网上现在仍然由很多的连接指向 Visual Age Micro Edition (VAME). 这也是SWT被构思的一个原因,他们想将SWT使用在嵌入式设备中的用户界面。这种渊源关系解释了当时为什么选择OSGI规范。

另外一个原因是除了OSGI没有其他的规范。OSGI规范在轻量级服务架构应用方面被广泛的支持。而且OSGI被好多电信业的知名公司和一些其他行业的知名公司所支持。他们需要使用OSGI来同Sun的J2ME来抗衡。

JSR277和JSR291

http://www.jcp.org/en/jsr/detail?id=291

Establish a JCP specification for a dynamic component framework supporting existing Java SE environments based on the OSGi dynamic component model specifications.

由Apache Software Foundation,BEA Systems, Inc.,IBM,Intel Corporation,Nokia,Nortel Networks,Peter Kriens,Richard Hall,SAS Institute, Inc发起。IBM是JSR291规范的领导者。

http://www.jcp.org/en/jsr/detail?id=277

The specification defines a distribution format and a repository for collections of Java code and related resources. It also defines the discovery, loading, and integrity mechanisms at runtime.

http://www.jcp.org/en/jsr/detail?id=232

Create a predictable management environment for mobile devices capable of installing, executing, profiling, updating, and removing JavaTM and associated native components in the J2METM Connected Device Configuration.

有哪些开源的产品实现了 OSGI,他们的侧重点是什么

目前有不少公司对OSGi service platform推出了自己的实现,象ibm的smf(Service Management Framework,嗯,多好的名字,在那么多的platform实现中,我个人最喜欢这个名字,言简意赅)。

德国的ProSyst公司(http://www.prosyst.com)是OSGi Alliance中非常活跃的推动者,看看他们的产品列表吧http://www.prosyst.com/products/osgi.html(他们甚至提供了kvm + cldc的OSGi framework)

开源的Oscar(http://oscar.objectweb.org/),Knopflerfish(http://www.knopflerfish.org/)

对于OSGi的成功应用,最有名的应该是eclipse了,它就是基于OSGi service platform的产品。还有Apache,据说OSGi将被应用于其新一代的build工具中。这些都是j2se和j2ee的应用,而基于j2me的,手机(对应OSGi Alliance的MEG)和车载设备(对应OSGi Alliance的VEG)是OSGi的主要领域,OSGi Alliance已经有相应的规范,这些领域的应用相信会更加精彩,让我们拭目以待吧。

OSGI 与 JMX 的关系

JMX 与 OSGi 在功能上的许多重迭之处,在国外已经有人讨论过 (例如 Eclipse Embeds OSGi Based MicroKernel 及 JMX vs. OSGi - The New Flavor of the Eclipse Runtime)。不过我认为重点是:

  1. JMX 本来设计的用途就只为了管理,我们不该把他拿来 (over use) 作为开发应用程序的组件 (那是 EJB 或 JavaBeans 该做的事)。但 OSGi 却可以!
  2. JMX 多数用于 server 系统中,而 OSGi 却不限于所开发的应用程序。你可以用它开发 embedded 系统、desktop 程序,甚至是 server 程序。

OSGi 不但提供了与 JMX 相似的容器管理能力,甚至它本身就是一套精密的 Framework。OSGi 采用Micro-Kernel 的架构,可以提供无限延伸的功能。OSGi 的 Bundles 在线更新功能、以及应用程序之微量内存执行能力,都是开发应用程序的利基。

行文至此,又觉得 OSGi 与 JCA、JNDI 都有一些功能重迭及互补之处。只是 JMX、JCA、EJB、JNDI都经 JCP 标准,都属于 J2EE 家族成员,但 OSGi 过去屈居于 Embedded System,声名就不若前述标准响亮...。我觉得这完全是两种思维模式:J2EE 的思维是 build on large scale,OSGi 的思维是 build on dynamic scale。OSGi 以小搏大。

为什么要用osgi,我认为主要是因为java至今没有出现一个方便易用的组件配置模型。过去,JMX、ClassLoader、reflect都似乎可以做这个事情。但是,JMX太麻烦了,况且原本为J2EE准备的JMX,确实不太易用,走专用的协议,需要专门的客户端,需要adapter来访问等等....

而ClassLoader,单独用ClassLoader,需要自己在其上构建一层包装,否则用起来很麻烦。Reflect的配置方式和ClassLoader一样的问题 。

但是,所有java的组件配置方式,包括使用classloader的osgi在内共有的一个问题就是,被替换组件的回收时间无法控制。

OSGI 在 Server 端发挥作用

osgi是对j2se的增强,可以作为j2ee的基础。jboss之所以在jcp投osgi的反对票,是因为jboss的核心(新项目名为microco­ntainer)实际上与osgi做的是同一件事情,都是要实现组件的动态部署和配置,不同的是他们用的是JMX。Geronimo选用的是JMX+IoC这种­方案作为内核。Oracle的产品也是这种发展方向。所以我认为osgi可以用作j2ee应用服务器的内核,与j2ee标准没有冲突。最好的证明是Equiox­项目将会release一个osgi环境的Web/Servlet Container。

我认为osgi可以在j2ee上提供一个支撑平台的解决方案。很多j2ee容器都是通过自定义classloader来实现装载的,其实我觉得EJB的组建模型不过就是classloader上的噱头。

而osgi则给出了一个完善的classloader体系,不再象过去,使用j2ee的标准只见EJB不见classloader,于是各个场上自己搞自己的。 JMX比较起来还是太麻烦了。

OSGI 在 EOS 中的应用

。。。


 




《 OSGI学习 》 的评论也很精彩,欢迎您也添加评论。查看详细 >>





JavaEye推荐
上海乐福狗信息技术有限公司:诚聘技术经理和开发工程师
免费下载IBM社区版软件--它基于开放的标准,支持广泛的开发类型,让您的开发高效自主!
京沪穗蓉四地免费注册,SOA技术高手汇聚交锋.
上海:优秀公司德比:高薪诚聘 资深Java工程师
广州:优易公司:诚聘Java工程师,开发经理
上海:尤恩斯国际集团:诚聘开发工程师
北京:优秀公司NHNChina招聘:WEB开发,系统管理,JAVA开发, DBA



文章来源: http://yuping.javaeye.com/blog/115875
posted @ 2007-08-20 14:25 fengzhi 阅读(386) | 评论 (0) | 编辑 收藏