通过 Lotus Domino Java 代理消费 Web 服务
Web 服務是一種允許兩臺或更多的計算機在網絡中交互的系統設計。這種服務的主要優點是,它是在多臺不同操作系統的計算機和應用服務器之間發送對象的標準解決方法。例如,我們的公司使用 Web 服務從一臺運行 Microsoft .NET Framework 的計算機向基于 IBM Lotus Domino 的內聯網發布文章。我們最近完成了另一個項目,公開了 Lotus Domino 7 服務器上的 Web 服務的專題報告。基于 Java 的應用服務器讀取報告服務器,我們必須協商的惟一東西是 Web Services Description Language(WSDL)文件。
本文向您展示了如何創建 Domino Java 代理消費 Web 服務。它使用 Apache Axis 生成 Java 存根并讀取 WSDL 文件。我們提供一個包含可以在本文以下部分使用的 Web 服務的數據庫示例。更多信息請參見 “下載” 部分。
本文假設您是一個有經驗的 Lotus Notes 和 Domino 應用程序開發人員,熟悉新的 Domino Web 服務設計元素。要學習有關新的 Domino Web 服務設計元素的更多知識,請參閱 developerWorks Lotus 文章 “Lotus Notes/Domino 7 Web Services”。
Web 服務的組件
Web 服務包含幾個組件。這些組件包括:
- WSDL 文件
- 面向服務體系結構(Service-Oriented Architecture,SOA)
- 各種協議
?
WSDL 文件
WSDL 是 Web 服務安裝的粘合劑(glue)。每個 Web 服務發布一個 WSDL 文件,該文件包含它可以處理哪些方法和自變量的信息,以及不同方法返回什么對象的信息。本文使用的是一個包含簡單 Web 服務的數據庫(在本實例中,是 Lotus Domino 7 數據庫)。
盡管這個 Web 服務很簡單,但是這個服務的 WSDL 文件是十分詳細的。當然,這么詳細的一個原因是 WSDL 文件使用詳細的格式,XML。可是,考慮到 WSDL 文件包含 Web 服務發送和接收的所有對象的描述,這個文件大小不算過分。本文 Web 服務例子的 WSDL 文件有一個名為 ComplexClass 的 Java 類,代碼片段如下所示:
| <complexType name="MyComplexClass"><sequence><element name="alpha" nillable="true" type="xsd:string"/><element name="calcA" type="xsd:int"/><element name="calcB" type="xsd:int"/><element name="result" nillable="true" type="xsd:int"/></sequence></complexType> |
面向服務體系結構
面向服務體系結構(Service-Oriented Architecture,SOA)在過去的十年已經出現。簡單地說,SOA 是一種軟件體系結構,它更多地集中于業務而不是公用的、技術驅動的解決方案。它基本上是以消費者-提供者方式設計用于 Web 服務的體系結構。SOA 方法分離各個層,消費者通過服務層與業務對象進行交互,而不是直接進行交互。
關于 SOA 的更多信息,請參閱 developerWorks SOA 和 Web 服務上的 SOA and Web services 新手入門 頁面。
Web 服務使用的協議
Web 服務消息不受使用 HTTP 的限制。它也可以使用 SMTP、Extensible Messaging and Presence Protocol(XMPP),甚至 FTP。但是,必須遵守 SOAP;否則,接收系統就很難解釋消息。在老一點兒的系統上,可以找到 XML-Remote Procedure Call(XML-RPC),但是 SOAP 是目前正確的協議。
Web 服務的好處是您不必研究各種協議和標準:所有這些都由應用服務器和開發工具處理。在這個例子中,Apache Axis 幫助您解釋 WSDL 并生成 Java 代碼存根。
數據庫示例
在開始使用 Apache Axis 工具前,必須有一個發布 WSDL 文件的 Web 服務。在本文的 “下載” 部分,有兩個數據庫示例:WebServiceConsumer.nsf 和 MyWebService.nsf。它們的名稱表明了它們的作用。在把 MyWebService.nsf 下載到 Lotus Domino 7 服務器之后,用可以運行受限代理的 ID 標記 Web 服務設計元素 —— MyWebservice。WebServiceConsumer.nsf 僅供參考。
|
Apache Axis
Apache Axis 是一個包括 SOAP 服務器和許多生成并部署 Web 服務的不同工具的完整框架。在本文中使用通信部分和 WSDL2Java 方法。但是,首先必須安裝 Apache Axis。
先決條件
在可以構建、測試和部署本文中描述的解決方法前,必須具備如下條件:
- Lotus Domino 7 服務器和 IBM Lotus Domino Designer
- Java 軟件開發工具包(JDK)
- Apache Axis 框架
?
我們假設您已經安裝了 Lotus Domino 7,并且您知道如何獲得 Java 環境并運行。(本文的 “參考資料” 部分提供了所有必須下載的鏈接。)
表 1 顯示了在我們的系統中使用的文件結構。如果您選擇復制這個結構,可以重用稍后提到的批處理文件和類路徑,也可以選擇使用您自己的策略。我們為每一個目錄使用工作名稱,這樣不會混亂。批處理文件是由變量驅動的,所以可以很容易地修改一兩行代碼使它在您的系統中運行。
表 1. 建議的文件結構
| 工作名稱 | 路徑 |
| 服務器路徑 | C:\lotus\DominoR7StandAlone |
| JDK 版本 2 | C:\java\j2re1.4.2_09 |
| Apache Axis | C:\java\Axis |
| 工作目錄 | C:\java\consumer |
下載并安裝 Apache Axis
在下載 Apache Axis 之后,將軟件包解壓到 Axis 目錄。(參見表 1 的建議路徑。)本文使用 Apache Axis 提供的兩個特性。一個是通信類,實際上,除了要把它們導入 Domino 環境,您不需要知道其他的任何東西。另一個特性是 wsdl2java 工具,Apache Axis 可以使用該工具讀取 WSDL 文件并為所有需要的方法和對象生成完整的 Java 存根。
可以啟動 shell 并開始運行 Apache Axis 類,但是我們發現啟動每個命令要使用 100 個字符以上的類路徑是很不方便的。一個解決方法是在一般 Java 類路徑中為 Apache Axis 設置所需要的完整的類路徑,但是我們更喜歡另一個解決方法:維護設置類路徑的批處理文件。以下代碼片段顯示了名為 wsdl2java.bat 的批處理文件,它存在于工作目錄中。
| @echo OFFrem *******************************************************rem *** wsdl2java.bat ****rem *******************************************************set AXISPATH=c:\java\AXIS\libset JAVAPATH=C:\java\j2re1.4.2_09set DOMINOJAVAPATH=C:\lotus\DominoR7StandAlone\jvm\lib\extset CP=%AXISPATH%\axis.jarset CP=%CP%;%AXISPATH%\commons-logging-1.0.4.jarset CP=%CP%;%AXISPATH%\commons-discovery-0.2.jarset CP=%CP%;%AXISPATH%\jaxrpc.jarset CP=%CP%;%AXISPATH%\saaj.jarset CP=%CP%;%DOMINOJAVAPATH%\mail.jarset CP=%CP%;%DOMINOJAVAPATH%\activation.jarset CP=%CP%;%AXISPATH%\wsdl4j-1.5.1.jar%JAVAPATH%\bin\java -cp %CP% org.apache.axis.wsdl.WSDL2Java %1 |
|
創建 Web 服務消費代理
通過從 Web 服務獲取 WSDL 文件開始創建代理。我們假設您正在使用已提供的 Web 服務 —— MyWebservice —— 并已經將它復制到 Lotus Domino 7 服務器。要想看到 WSDL 文件,將瀏覽器指向數據庫并通過命令 ?WSDL 打開 Web 服務,如圖 1 所示。
圖 1. 在瀏覽器中顯示 WSDL 文件的例子
在確定 WSDL 文件出現后,可以把 WSDL 文件保存到工作目錄中,或者使用 URL 將 Apache Axis 工具包直接指向網絡中的 WSDL 資源。現在,可以開始從 WSDL 文件生成 Java 存根。
|
從 WSDL 文件生成 Java 文件
WSDL2Java 函數可以把文件名作為參數,如下所示:
C:\java\consumer>wsd12java.bat MyWebservice.xml
或者以 WSDL 文件的完整的 Uniform Resource Indicator(URI)作為參數:
C:\java\consumer>wsd12java.bat http://localhost/mywebservice.nsf/MyWebService?WSDL
為了在本地工作,下載并使用名稱 MyWebservice.xml 把 WSDL 文件保存到工作目錄中,如第一個命令所示。
注意:我們工作使用的 Web 服務只是為了示范的目的(例如,沒有使用名稱空間)。所以,您現在在工作目錄中看到一個名為 DefaultNamespace 的新目錄。
wsdl2java.bat 的運行結果是生成五個 Java 文件:
- DominoSoapBindingStub.java
- HelloWorld.java
- HelloWorldService.java
- HelloWorldServiceLocator.java
- MyComplexClass.java
?
在這五個文件中,只有兩個是真正重要的:HelloWorld.java 和 MyComplexClass.java。其他三個用于執行調用和解析響應。如果您想學習更多關于 Apache Axis 框架的內容,建議您訪問 Apache Axis wiki。
HelloWorld.java 是一個描述 Web 服務可以處理的方法和自變量的接口。MyComplexClass.java 是 MyComplexClass 對象的 JavaBeans 版本,當調用 getMyComplexClass() 方法時 Web 服務用它進行響應。
現在,在 Domino 7 數據庫中創建一個新的腳本庫,可以使用它消費 Web 服務。
|
把 Java 文件導入 Lotus Notes
Web 服務消費代理使用 Apache Axis 生成的文件。導入 Java 文件最容易的方法是創建 Java 腳本庫(不要與 JavaScriptlibrary 混淆)。導入文件并記住將工作目錄設置為基礎路徑(參見圖 2)。
圖 2. 保存 Apache Axis 生成的 Java 存根的腳本庫
注意:基礎目錄是工作目錄,而不是 DefaultNamespace 目錄,這一點非常重要。
當腳本庫放在適當的位置并編譯過之后,就可以關閉它并創建新的 Java 代理。這個代理使用 Apache Axis 客戶機類。這些類是 Axis 框架的一部分,所以必須導入。
Apache Axis 客戶機位于 Axis 目錄下的 Java 存檔文件(JAR 文件)中。有一些向代理公開這些類的選項,其中一個選項是直接在代理中導入這些類。但是由于這些類的天然性質 —— 當您發現 Web 消費是多么容易的時候就可以多次使用它們 —— 把它們存儲到 IBM Lotus Notes 的其他 JAR 文件使用的 .\jvm\lib\ext 目錄中是更自然的方法。
在 Lotus Notes 客戶機目錄中,將 JAR 文件 axis.jar、commons-discovery-0.2.jar 和 commons-logging-1.0.4.jar 從 .\Axis\lib 復制到 .\jvm\lib\ext。(在使用這些附加文件之前必須重新啟動 Lotus Notes 客戶機。)當 Lotus Domino Designer 運行時,在開始調用 Web 服務之前只剩下幾個步驟。
|
調用 Web 服務的 Lotus Notes 代理
當 JAR 文件放在 .\jvm\lib\ext 目錄下并已經重新啟動 Lotus Domino Designer 之后,就可以編寫 Web 消費代理的代碼了。從創建普通的 Java 代理開始。下一步,打開 Edit Project 窗口導入先前創建的腳本庫。關閉項目屬性窗口,并添加必須的如下所示的導入行:
| 00 import lotus.domino.*;01 import java.net.URL;02 import org.apache.axis.client.Call;03 import org.apache.axis.client.Service;04 import DefaultNamespace.*;05 import java.io.*;06 public class JavaAgent extends AgentBase {07 public void NotesMain() {08 try {09 Session session = getSession();10 AgentContext agentContext = session.getAgentContext();1112 URL endpoint = new URL("http://localhost:80/MyWebService.nsf/MyWebService");1314 Service service1 = new Service();15 DominoSoapBindingStub service = new DominoSoapBindingStub(endpoint,service1);16 String greeting=service.getGreeting();17 System.out.println(greeting);1819 String greeting2=service.getGreeting("Lotus");20 System.out.println(greeting2);2122 } catch(Exception e) {23 e.printStackTrace();24 }25 }26} |
在第 12 行,創建一個標準的 Java URL 指向您想要使用的 Web 服務。在第 14 行,實例化 Apache Axis 提供的 Service() 類。然后,在第 15 行實例化 DominoSoapBindingStub 服務,并使用新創建的 service1 對象和第 12 行的 URI 提供它。在第 16 行,用 Web 服務方法 getGreeting() 提供的值設置新的字符串。
保存代理并啟動 Java 控制臺。(這個控制臺是惟一一個現在能看到任何活動的地方。)當打開調試窗口時,選擇新的數據庫,然后運行代理,如圖 3 所示。
圖 3. 當代理完成后的 Java 控制臺
正如您所見,使用 Apache Axis 和 wsdl2java 工具非常節省時間。以前,在 Lotus Domino 5 代理中消費 Web 服務時,您必須坐下來手工解碼 SOAP 消息!
|
在服務器上運行 Web 服務消費代理
現在有了一個可以使用 Web 服務進行交互的強大代理。例如,您組織的內聯網可以以比過去使用的 Comma Separated Value(CSV)文件更奇特更精確的方式預訂最新的天氣預報。還可以將 Web 服務與昂貴的 Enterprise Resource Planning(ERP)系統一起使用。
在服務器上運行這個代理不需要其他的步驟。只要保證在 Agent Properties 對話框中將 “Set runtime security level” 屬性設置為 “2. Allows restricted operations”,簽名者就可以有適當的訪問權。
把先前描述的必要的 JAR 文件復制到 Lotus Domino 服務器的 .\jvm\lib\ext 路徑。但是注意,如果在正在運行代理的同一臺服務器上調用 Domino Web 服務,可能會經歷死鎖。
結束語
本文描述了構建 Domino 代理來消費 Web 服務的步驟。利用 Apache Axis 框架,可以節省許多時間并集中于業務價值。Apache Axis 已經使用了一段時間,它是穩定且可靠的。使用這樣一個第三方的工具使系統更易受攻擊,但是這個風險遠小于 SOA 能夠為您的組織所帶來的好處。
總結
以上是生活随笔為你收集整理的通过 Lotus Domino Java 代理消费 Web 服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用人脸数据集汇总
- 下一篇: echarts 有引导线和内部文字_点、