程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 在Java程序中內嵌Mozilla浏覽器

在Java程序中內嵌Mozilla浏覽器

編輯:關於JAVA

簡介

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 。如果之前沒有安裝過 XULRunner,可忽略這一 步。

如果之前版本的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

通過命令行注冊 XULRunner 。

注冊為供所有用戶使用:

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

導入 eclipse workspace

加入開發中的plugin 的required plugin 列表中。

獨立運行的程序:

下載平台所需的XULRunner 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 文件

<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet href="chrome://global/skin/" type="text/css"? >
  <window title="Calculator" style="width:145px"
    xmlns="http://www.Mozilla.org/keymaster/gatekeeper/there.is.only.xul"& gt;
  <vbox>
   <textbox id="anzeige" readonly="true"  value="123456789" />
   <grid>
   <rows>
    <row align="center">
    <button label="7" />
    <button label="8" />
    <button label="9" />
    <button label="+" />
    </row>
    <row align="center">
    <button label="4" />
    <button label="5" />
    <button label="6" />
    <button label="-" />
    </row>
    <row align="center">
    <button label="1" />
    <button label="2" />
    <button label="3" />
    <button label="*" />
    </row>
    <row align="center">
    <button label="0" />
    <button label="," />
    <button label="=" />
    <button label="/" />
    </row>
   </rows>
   </grid>
  </vbox>
  </window>

把這段代碼保存成 xul 後綴名的文件。通過基於 Mozilla 的SWT 浏覽器部 件訪問 XUL 文件,可以看到如圖所示的界面:

圖 5. XUL 文件在浏覽器中的顯示

總結:使用基於 Mozilla 的浏覽器部件的優缺點:

優點:在各個平台上提供統一的行為。提供對 XUL(XML User Interface Language) 的支持。可通過 JavaXPCOM 提供對浏覽器行為的定制和擴展。

缺點:需要在系統中預裝 XULRunner 。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved