简介
SWT 浏览器部件是 SWT 所提供的众多部件中较为复杂的一个,它提供了在 Java 应用程序中内嵌浏览器应用并通过 Java API 与之进行交互的能力。一个典型的应用场景是,开发者可以在客户段程序中嵌入一个内置浏览器,访问特定 HTML 应用,从而集 web 技术与客户端技术两者之所长,开发出具有更丰富功能和界面的软件。
本文主要包含两个方面的内容:1. 如何在 Java 应用程序中内嵌基于 Mozilla 的浏览器部件。 2. 使用 JavaXPCOM bridge 定制浏览器功能及与 XULRunner 进行更多交互。
本文中范例程序在 Mac OS 10.5, JDK1.5,XULRunner 1.8.1.3 环境下开发,编译与测试。
回页首
浏览器部件简史
SWT( The Standard Widget Toolkit)最早在 3.0 版本中引入浏览器部件,早期目的是为了提供一些简单的接口,使用户得以在 Java 程序中显示和浏览 HTML 页面。
最早,在不同的平台上的浏览器部件基于不同的内核,比如,在 Windows 上基于 Internet Explorer 内核,在 Linux 上基于 Mozilla,在 Mac 上基于 Webkit 。这种机制使得 SWT 浏览器部件风格尽量接近于各个操作系统上预装的浏览器 (Windows 上的 Internet Explorer, Linux 上的 Firefox,Mac 上的 Safari),但却导致了在不同平台下浏览器部件的行为不一致性。比如在 Linux 上的浏览器部件下打开 about:config 链接,你会看到 Mozilla 的用户偏好配置页面 ( 见图 1),但在 Windows 和 Mac 的 SWT 浏览器部件将显示空白页面。
为了解决这种行为不一致的问题并对外提供统一接口,SWT 在 3.3M5 版本中提出了 "Mozilla Everywhere" 的概念,在 Windows 上和 Mac 上也提供了基于 Mozilla 内核的浏览器部件。并在 SWT 3.3M6 中增加了对 JavaXPCOM 的支持,这就使得开发者可以通过 Java 语言访问所有 Mozilla 的公开接口,从而为内嵌浏览器提供更灵活的定制行为。
图 1. 基于 Mozilla 的 SWT 浏览器部件上的用户偏好设置页面
回页首
基于 Mozilla 的 SWT 浏览器部件
为了使用基于 Mozilla 的 SWT 浏览器部件,需要在操作系统中预先安装与注册 XULRunner 。那,什么是 XULRunner 呢?“ XULRunner 是一个单独的“ Mozilla 运行时”安装包,可用于启动多种如同 Firefox 和 Thunderbird 一样丰富的 XUL+XPCOM 应用程序。它提供了安装、升级和卸载这些应用程序的机制。 XULRunner 还将提供 libxul,这个解决方案允许把 Mozilla 技术嵌入到其它项目和产品中。”(此段定义译自https://developer.Mozilla.org/En/XULRunner)简单来说,XULRunner 是基于 Mozilla 的浏览器(如 Firefox,Camino 等)的核心。
XULRunner 的安装与注册:
- 下载合适版本的 XULRunner 。下载地址:
http://releases.Mozilla.org/pub/Mozilla.org/XULRunner/releases
。注意:如果在 Mac 下进行开发或者需要使用 JavaXPCOM,则需要下载 1.8.1.2 或更新版本。- Windows: 将下载的 zip 包解压到合适的文件夹,将当前目录设置为解压后的文件夹。
- Linux: 将下载的 zip 包解压到合适的文件夹,将当前目录设置为解压后的文件夹。
- Mac: 安装下载的 dmg 文件,将当前目录设置为 XULRunner 的安装位置。(通常为
/Library/Frameworks/XUL.framework/Versions/
Current) 。
如果之前版本的 XULRunner 注册为供所有用户使用,执行如下命令:
- Windows:
XULRunner --unregister-global
- Linux:sudo ./
XULRunner --unregister-global
- Mac: sudo ./
XULRunner-bin --unregister-global
如果之前版本的 XULRunner 注册为供当前用户使用,则执行命令:
- Windows:
XULRunner --unregister-user
- Linux: ./
XULRunner --unregister-user
- Mac: ./
XULRunner-bin --unregister-user
注册为供所有用户使用:
- Windows:
XULRunner --register-global
- Linux:sudo ./
XULRunner --register-global
- Mac: sudo ./
XULRunner-bin --register-global
注册为供当前用户使用:
- Windows:
XULRunner --register-user
- Linux: ./
XULRunner --register-user
- Mac: ./
XULRunner-bin --register-user
做完以上准备工作后,就可以通过简单的代码创建一个基于 Mozilla 的 SWT 浏览器部件。
清单 1. 创建一个简单的浏览器
Display display = new Display (); final Shell shell = new Shell (display); FillLayout layout = new FillLayout(); shell.setLayout(layout); Browser browser = new Browser(shell, SWT.MOZILLA); //1 browser.addTitleListener(new TitleListener(){ //2 public void changed(TitleEvent event) { shell.setText(event.title); } }); browser.setUrl("www.eclipse.org"); //3 shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); |
代码说明:
- 创建一个 SWT 浏览器部件,SWT.MOZILLA 样式用于指定此浏览器部件基于 Mozilla 。如果指定 SWT.NONE,则创建默认 SWT 浏览器部件(在不同平台上基于不同内核)
- 监听浏览器的标题事件 (TitleEvent) 。将窗口的标题设置为浏览器页面的标题。
- 访问
www.eclipse.org
。
Browser 类提供 setUrl(),getUrl(),setText(),getText() 等一系列方法和一系列监听器(Listener)供开发者使用,参见 SWT 文档。
图 2. 一个简单的浏览器:
回页首
JavaXPCOM
Browser 类所提供的 API 在实际开发中的确可以满足大部分的用户需求。但是如果要扩展浏览器的功能,提供更丰富细腻的控制,则可以使用 JavaXPCOM 进行进一步的开发工作。
这里需要解释一下一些概念。
XPCOM:XPCOM 的英文全称是 Cross Platform Component Object Model,即跨平台的组件对象模型。它是一种跟 COM 类似的组件技术。所不同的是它是跨平台的。 XPCOM 体系中最重要的基本概念是接口(Interface),组件(Component) 和服务(Service) 。接口定义功能,组件可以实现多个接口的功能,组件实现的改变不影响功能。服务则可以被认为是一种单态的组件。也就是说,XULRunner 的基本组成单元是 XPCOM 组件,它由许多 XPCOM 组件拼接而成,这些组件之间通过接口相互调用,协同完成浏览器的种种功能。
XULRunner 基于 XPCOM 的本质,使得 Mozilla 有着很强的扩展性和可定制性。
JavaXPCOM:顾名思义,JavaXPCOM 就是 Java 与 XPCOM 的桥梁。 JavaXPCOM 允许在 Java 和 XPCOM 间进行会话,这样一来,Java 应用程序就可以访问 XPCOM 对象,并且 XPCOM 也可以访问任何实现了 XPCOM 接口的 Java 类。借助 JavaXPCOM,开发者可以在 Java 应用程序中同 XPCOM 或嵌入的 Gecko 对话。 JavaXPCOM 和 XPConnect(JavaScript-XPCOM 桥)十分相似,并且使用 XPIDL 实现其功能。
为了在 SWT 中使用 JavaXPCOM,我们需要做一些准备工作:下列步骤引自 http://www.eclipse.org/swt/faq.php#howusejavaxpcom
- 在 eclipse 中运行程序:
- 下载 org.Mozilla.xpcom plugin( 下载XULRunner 1.8.1.3 Eclipse插件)
- 导入 eclipse workspace
- 加入开发中的 plugin 的 required plugin 列表中。
- 独立运行的程序:
- 下载平台所需的 XULRunner SDK(下载XULRunner 1.8.1.3 SDK)
- 将
lib/MozillaInterfaces.jar
加入你的程序的 Java build path 。
在 SWT 中,如果你创建了一个基于 Mozilla 的 SWT 浏览器部件,且 MozillaInterface.jar 在 classpath 中,则于 JavaXPCOM 的初始化工作会在浏览器部件的创建过程通过反射自动完成。用户可以直接使用 JavaXPCOM 的所有功能。
如下代码显示了如何使用JavaXPCOM:
示例 1
本例展示了如何通过 JavaXPCOM 编程改变浏览器文档中 DOM 结点的内容。(完整示例程序见附录)。
清单 2. 通过 JavaXPCOM 改变浏览器中 DOM 结点的内容
nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser(); //1 if (webBrowser == null) { System.out.println("Could not get the nsIWebBrowser from the Browser widget"); return false; } nsIDOMWindow window = webBrowser.getContentDOMWindow(); //2 nsIDOMDocument document = window.getDocument(); //3 nsIDOMElement list= document.getElementById("input1"); //4 list.setAttribute("value", "value after change"); //5 |
代码说明:
- Browser 类提供了一个非常重要的方法 getWebBrowser(), 通过它,用户可以访问到 XPCOM 接口 nsIWebBrowser,nsIWebBrowser 是 XULRunner 中一个十分重要的组件,通过它,开发者可以获取浏览器的 DOM 窗口,进而获取整个 DOM 树的内容并对其进行修改。
- 获取浏览器 DOM 窗口。
- 从 DOM 窗口获取 DOM 文档。
- 获取 id 为 input1 的 DOM 结点。
- 修改 DOM 结点的属性。点击按钮后,文本框中的字符串将被改变为“ value after change ” 。
图 3. 用 JavaXPCOM 改变浏览器中 DOM 结点的内容
示例 2
基于 Mozilla 的浏览器的用户偏好设置可以通过在浏览器中输入 about:config 访问到(见本文图一)。这些偏好设置可以通过编程改变。示例二展示了通过JavaXPCOM
为浏览器组件
设置用户代理的过程。(完整示例程序见附录)
清单 3. 通过 JavaXPCOM 为浏览器组件设置用户代理
Mozilla Mozilla = Mozilla.getInstance(); //1 nsIServiceManager serviceManager = Mozilla.getServiceManager(); //2 String contractID = "@Mozilla.org/preferences-service;1"; nsIPrefService prefService = (nsIPrefService) serviceManager.getServiceByContractID( contractID, nsIPrefService.NS_IPREFSERVICE_IID); //3 // Get a branch to access to the entire preference tree nsIPrefBranch branch = prefService.getBranch(""); //4 branch.setCharPref("network.proxy.http", "127.0.0.1"); //5 branch.setIntPref("network.proxy.http_port", 8080); //6 |
代码说明:
获取 Mozilla 类的单态实例。
获取 Mozilla 的服务管理器。 Mozilla 的服务管理器负责管理服务组件,开发者可以通过契约 ID(contract ID)向 Mozilla 请求相对应的服务。
通过用户配置管理的契约 ID “ @Mozilla.org/preferences-service;1 ”获取配置管理服务。
- 在配置树中获取管理 proxy 的分支。
设置 ProxyIP 。
- 设置 Proxy 端口。
设置完成后,通过 about:config 链接可以查看修改过的 proxy 设置。 |
图 4. 通过 JavaXPCOM 为浏览器组件设置用户代理
回页首
使用 XUL: 充分利用基于 Mozilla 的 SWT 浏览器部件的好处
XUL(XML User Interface Language)用 XML 来标记用户界面,且提供了一套通用控件供开发者使用。基于 Mozilla 的浏览器可以象渲染普通的 HTML 文件一样渲染 XUL 文件。因此,通过基于 Mozilla 的 SWT 浏览器部件,除了可以在应用中嵌入除了普通的 HTML 页面外,还可以在应用中嵌入 XUL,达到快速开发,充分利用各种开发技术的目的。
关于 XUL 的更多知识,请参阅 https://developer.Mozilla.org/en/XUL
下面用一个简单的例子演示 XUL 的使用:
清单 4. 一个简单的 XUL 文件
|
把这段代码保存成 xul 后缀名的文件。通过基于 Mozilla 的 SWT 浏览器部件访问 XUL 文件,可以看到如图所示的界面:
图 5. XUL 文件在浏览器中的显示
总结:使用基于 Mozilla 的浏览器部件的优缺点:
优点:在各个平台上提供统一的行为。提供对 XUL(XML User Interface Language) 的支持。可通过 JavaXPCOM 提供对浏览器行为的定制和扩展。
缺点:需要在系统中预装 XULRunner 。