首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

XULRunner with Java: JavaXPCOM Tutorial 一

2012-08-24 
XULRunner with Java: JavaXPCOM Tutorial 1这篇教程更新于2008年夏天,用来集成SWT和XULRunner来在SWT里显

XULRunner with Java: JavaXPCOM Tutorial 1

这篇教程更新于2008年夏天,用来集成SWT和XULRunner来在SWT里显示一个浏览器。要想获得更多信息,请参考
http://www.eclipse.org/swt/faq.php#whatisbrowser

1,简介
?????? 这篇教程有两个目的。首先,我们能学到一些XPCOM的概念和怎么通过JavaXPCOM来在java里使用它。其次,我们学到怎么在

java程序里嵌入Firefox浏览器。
?????? 这里的例子我们开发,编译和测试的环境是Ubuntu 8.04和JDK1.6(译注,我使用的是windows xp)。我们在windows下遇到

一个问题,用户无法在form里输入文本,虽然在例子里并不需要这点。
1.1 下载资源??
????? 例子的源码在相关章节的开始以及文章的最后都有下载,当然,你也可以下载所有的代码
http://ladyr.es/wiki/attachment/wiki/XPCOMGuide/complete-guide-resources-windows.zip? windows
http://ladyr.es/wiki/attachment/wiki/XPCOMGuide/complete-guide-resources-linux.zip?? linux

2. 安装XULRunner
???? JavaXPCOM是一个用来访问XULRunner里XPCOM组件和服务的java库。在这里我们介绍了一些方法通过java来使用XULRunner组件

和服务。JavaXPCOM也能在java程序里嵌入Gecko。JavaXPCOM需要Java1.4.2或者更新的版本。为了使用JavaXPCOM你需要下面的步骤


??? XULRunner:你需要安装XULRunner。它在开发中并不断变化。这个教程使用的是1.9的版本,这个版本built的时间是2008-6-19.

安装XULRunner的方法:
????? 1. 根据自己的操作系统下载合适的安装包(译注,我在windows xp下无法使用XULRunner1.9,我使用的是
??????????????? xulrunner-1.8.1.3.en-US.win32-20080128)
?? 2.解压它,比如把它解压到c:/XULRunner
?? 3.进入这个路径
?? 4.卸载以前的注册
?? 5.注册这个版本
?? (译注:注册并不是必须的,注册后可以在程序里不用知道XULRunner的路径,不注册也可以,不过程序里要知道路径)
javaxpcom.jar
MozillaInterface.jar
MozillaGlue.jar

3.在Java里使用JavaXPCOM
3.1 JavaXPCOM初始化
XPCOM(Mozilla Cross-platform Object Model)是一个机遇组件的架构。为了使用XPCOM,我们需要一些初始化和清理的代码。有

两种方法来使用它,请看下面注释过的代码:
首先我们可以使用initXPCOM方法


我们可以简化一下:
// Get the component manager
ComponentManager cm = Mozilla.getInstance().getComponentManager();

// Get the part of the component corresponding to the interface that we want to use
nsIInputStreamChannel isc = (nsIInputStreamChannel)
???????? cm.createInstance("{6ddb050c-0d04-11d4-986e-00c04fa0cf4a}", null,

nsIInputStreamChannel.NS_IINPUTSTREAMCHANNEL_IID);

// Call the method (one or more than one)
System.out.println("Content-Length: " + isc.getContentLength());

也可以通过contractID来访问:
// Get the component manager
ComponentManager cm = Mozilla.getInstance().getComponentManager();

// Get the part of the component corresponding to the interface that we want to use
nsISupports obj = cm.createInstanceByContractID("@ mozilla.org/file/local;1", null, nsISupports.NS_ISUPPORTS_IID);

// Get the part of the component corresponding to the interface that we want to use
nsILocalFile file = obj.queryInterface(nsILocalFile.NS_ILOCALFILE_IID);

// Call the method (one or more than one)
file.initWithPath("/home/alpgarcia/xpcom-file-test.txt");

简化形式:
// Get the component manager
ComponentManager cm = Mozilla.getInstance().getComponentManager();

// Get the part of the component corresponding to the interface that we want to use
nsILocalFile file = (nsILocalFile)cm.createInstanceByContractID("@ mozilla.org/file/local;1", null,

nsILocalFile.NS_ILOCALFILE_IID);

// Call the method (one or more than one)
file.initWithPath("/home/alpgarcia/xpcom-file-test.txt");

在JavaScript里,我们通过调用instanceOf来检查一个组件是否实现了一个接口:

var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance();
if (aFile instanceOf Components.interfaces.nsILocalFile){
?? var aLocalFile = aFile.QueryInterface(Components.interfaces.nsILocalFile);
?? ...
}


在java里,instanceof运算符是其它的含义。在java里只能通过QueryInterface来判断。如果调用失败,那么这个组件就没有实现特

定的接口。如果我们还是用JavaScript的写法,那么就会得到不同的结果(错误的)。试试下面的代码:

?




下面是一个关于域名的例子:

? 

热点排行