在 Lotus Domino 中管理數據,但又要利用 IBM WebSphere 高度可伸縮的優(yōu)點,事務型的 J2EE 平臺使用下面這些解決方案的一種:Domino XML 或 Domino JSP 標簽庫。在本系列的第二篇文章中,我們將重點介紹 Domino JSP 標簽庫。
在這個由兩部分組成的系列文章的 第 1 部分 中,我們將介紹如何使用 Domino XML(也稱為 DXL)集成 Lotus Domino 和 IBM WebSphere。DXL 可以讓您訪問 Domino 對象,而不用了解太多有關 Lotus Domino 的知識。然而,具有一些 Java 方面的經驗對于使用 DXL 方法來說也是必要的。對于那些 Java 經驗很少的 Notes 應用程序開發(fā)者來說,可以使用 Lotus Domino Toolkit for WebSphere Studio 中提供的 Domino JSP 標簽庫。(這個工具包在 Lotus Notes/Domino 6.0.2 及更新的版本中可用,用戶可以從 Passport Advantage 下載這個工具包。)
從 Lotus Domino 6 開始,Lotus 提供了兩個 JSP 標簽庫。這兩個標簽庫讓程序員可以開發(fā)與 J2EE 兼容的應用服務器上的 Lotus Domino 進行交互的 J2EE 應用程序。在可以使用標簽庫之前,那些想要將自己的應用程序與 Lotus Domino 連接的 JSP 開發(fā)者必須把 CORBA 和 IIOP 調用構建在應用程序中。這導致很大的復雜性,并且經常需要使用一些特定于數據庫的代碼,這些代碼幾乎是不可重用的。隨著協作能力需求的增長,需要一種更智能的、功能更強大的解決方案。
Lotus 了解到了這種需求,因此創(chuàng)建了兩個標簽庫,它們對通用的 Lotus Domino 和 J2EE 功能進行了抽象和封裝。這些庫是在標簽庫描述符 domtag.tld 和 domutils.tld 中定義的。Domutils.tld 定義了處理所有 J2EE 應用程序通用的任務的工具標簽。這些標簽不是 Lotus Domino 特有的,可以獨立于 Domino 服務器應用于任何應用程序。在 domtag.tld 中定義的標簽是 Lotus Domino 特有的。它們提供了對所有的 Domino 元素的編程訪問能力,包括設計、訪問控制列表和文檔。在本文中,我們將著重介紹 Domino 特有的標簽(在 domtag.tld 中定義的標簽)。從現在開始,我們就將其簡稱為 taglib。
開始之前
taglib 比第一篇文章中所介紹的 XML 方法需要更深入的 Lotus Domino 方面的知識。它使用了 Domino 框架中的一些專用術語和控件。為了有效地使用 taglib,重要的是您要深入理解 Lotus Domino、各種設計元素以及您要訪問的數據的結構。對第 1 部分的路線圖部分進行回顧可以幫助您確定這種方法是否更適合于您和您的應用程序。
需求
taglib 遵守 JSP 1.1 和 Servlet 2.2 規(guī)范,支持大部分 J2EE 兼容的應用服務器。本文中的例子要安裝到 IBM WebSphere Application Server 5.1 上,并使用 WebSphere Studio Application Developer 進行開發(fā)。本文假設您熟悉 Domino 對象和術語,并且了解使用 WebSphere Studio Application Developer 進行 J2EE 編程的基本知識。
注意:如果不準備讓 Lotus Domino 來處理 IIOP,在使用 taglib 時就不需要任何 CORBA 或 IIOP 編程的知識。
軟件需求如下:
- WebSphere Application Server 5.x 或其他 J2EE 兼容的應用服務器
- Lotus Domino 6.x,并且安裝并啟用了 DIIOP 服務
準備 Lotus Domino
taglib 使用 CORBA(Command Object Request Broker Architecture)和 IIOP(Internet Inter-ORB Protocol)技術與 Lotus Domino 進行通信。您必須設置 Domino 服務器監(jiān)聽 IIOP 請求。首先,確保已經安裝了 DIIOP。在 Domino 終端中執(zhí)行 show task 或 load diiop 命令,可以幫助判斷現在是否已經安裝了 DIIOP。如果還沒有安裝,請從 Domino 安裝光盤上安裝 DIIOP。
接下來,編輯 Domino 服務器的 Notes.ini 文件,設置為在啟動 Lotus Domino 時自動加載 DIIOP。找到以 ServerTasks 開始的那一行。在本行的最后,添加 diiop。重新啟動 Domino 服務器,并檢查是否有 DIIOP 服務器的啟動消息。 圖 1. 在服務器啟動過程中啟動 DIIOP 進程
在 DIIOP 進程啟動時,它在 Domino HTTP 根目錄(Windows 中 Domino 默認的安裝目錄為 C:\lotus\domino\data\domino\html)中創(chuàng)建一個名為 diiop_ior.txt 的 IOR(Internet Object Reference)對象。如果您使用 Lotus Domino 作為 HTTP 服務器,就必須告訴 DIIOP 將這些文件放到您的 HTTP 服務器的根 HTML 目錄中。
- 打開 Domino Server 文檔。
- 選擇 Internet Protocols 標簽 - DIIOP 子標簽。
- 在 External HTML directory 字段中,輸入非 Domino HTTP 服務器的根 HTML 目錄的完整路徑名。
- 保存這個 Server 文檔,并重新啟動 DIIOP。
圖 2. Server 文檔的 DIIOP 部分
使用一個 Web 瀏覽器測試并查看該文件是否可以訪問:http://127.0.0.1/diiop_ior.txt 圖 3. Web 瀏覽器中的 diiop_ior.txt 文件
配置 J2EE 應用程序環(huán)境
要使用 taglib,需要兩個 JAR 文件:NCSO.jar 或 Notes.jar(請參閱側欄)和 domtag.jar。
- 在 Windows Explorer 中,打開 [Notes installation path]\Data\domino\java。找到并將 domtags.jar 和 NCSO.jar 拷貝到 Web 應用程序的 WEB-INF/lib 目錄中。
注意:如果您有多個 Web 應用程序使用 taglib,請將這些文件拷貝到應用服務器的共享庫目錄中。 圖 4. WebSphere Studio Application Developer 的 J2EE 視圖
- 在 [Notes installation path]\Data\domino\java 目錄中,找到并將 domtags.tld 拷貝到項目的 WEB-INF 目錄中。這個文件就是標簽庫描述符(即 TLD 擴展)。它說明這些標簽是相關于底層的 Java 代碼的,因此應用服務器可以理解這些標簽。
- 接下來,找到并打開 Web 應用程序的 web.xml 文件。添加下面的 taglib 引用,并保存所做的修改。
<taglib id="domtags">
<taglib-uri>domtags.tld</taglib-uri>
<taglib-location>/WEB-INF/domtags.tld</taglib-location>
</taglib>
|
下面是一個 web.xml 文件的例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java./dtd/web-app_2_3.dtd">
<web-app id="WebApp">
<display-name>ArticleWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<taglib id="domtags">
<taglib-uri>domtags.tld</taglib-uri>
<taglib-location>/WEB-INF/domtags.tld</taglib-location>
</taglib>
</web-app>
|
 |
|
Domino 提供了兩個 JAR 文件,用于編程訪問 Domino 對象。這兩個文件是 Notes.jar 和 NCSO.jar。Notes.jar 用來訪問 本地的 Domino 服務器(此時 Lotus Domino 和 Java 程序運行在相同的服務器上)。NCSO.jar 包含了用來訪問遠程服務器的其他 CORBA/IIOP 代碼。
在決定使用哪個 JAR 文件時,請考慮以下因素:
- 運行的 Java 程序和 Lotus Domino 的相對關系如何?如果它們運行在相同的機器上,那么使用 Notes.jar 可以獲得更好的性能。
- 您關心可擴展性嗎?即使現在您是在相同的機器上運行 Java 程序(單獨的 Java 程序和非 J2EE 的程序)和 Lotus Domino,將來您可能會發(fā)現需要將其擴展到專用的服務器上。在這種情況中,請使用 NCSO.jar ,這樣可以獲得更好的適應能力。
- Java 程序要在一個應用服務器上運行嗎?在 WebSphere 的情況中,即使它與 Lotus Domino 在相同的機器上,也需要使用 NCSO.jar。
| |
設置默認的參數
taglib 有很多上下文參數(Context Parameter),您可以在 web.xml 文件中進行設置。我們高度推薦您盡可能利用這些應用程序范圍的參數,這樣可以提高程序的可移植能力,并且簡化將來的維護工作。
在我們的例子中,我們設置了主機名(127.0.0.1)和數據庫(articleSample.nsf)作為上下文參數,它們分別是 lotus.domino.default.host 和 lotus.domino.default.dbname。
要這樣設置,請打開 web.xml,然后添加以下行并保存。
<context-param id="dominohost">
<param-name>lotus.domino.default.host</param-name>
<param-value>127.0.0.1</param-value>
</context-param>
<context-param id="dominodbname">
<param-name>lotus.domino.default.dbname</param-name>
<param-value>articlesample.nsf</param-value>
</context-param>
|
使用 domtags
在接下來的部分中,我們將使用在上一篇文章中使用的 Car 數據庫。我們將構建 4 個 JSP,它們分別實現以下功能:
- 顯示一個文檔。
- 顯示一個 Domino 視圖的內容。
- 啟用 Domino 視圖搜索。
- 允許用戶創(chuàng)建并編輯文檔。
在開始之前,您必須在所有使用 taglib 的 JSP 中都包括這個 taglib 的聲明。它告訴應用服務器每個以單詞 domino 開始的標簽都是對domtags 標簽庫描述符中一個項的引用。例如, <domino:db>。(盡管您可以使用不同的前綴,但是我們高度建議使用 domino 作為前綴。) <%@ taglib uri="domtags.tld" prefix="domino" %>
顯示文檔
我們首先創(chuàng)建一個簡單的 JSP 來顯示一個 Notes 文檔的內容。它利用一個單獨的查詢字符串 uid,其值為所請求文檔的惟一 ID。在 JSP 編輯器中,創(chuàng)建一個新的 JSP disptagcar.jsp。首先輸入前面提到的 taglib 聲明。包括一個包含 lotus.domino.* 的 import 行是一個好主意,因為這樣可以允許您直接訪問 Domino 對象。后面我們會使用很多這種聲明。
<%@ taglib uri="domtags.tld" prefix="domino" %>
<%@page import="lotus.domino.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Vehicle information using Domino Tag Library</title>
</head>
<body>
<h1>Vehicle information using Domino Tag Library for <%= (String) request.getParameter("unid")%></h1>
<domino:document>
<table border="1" width="100%" cellspacing="0" cellpadding="0">
<tr bgcolor="#ccff00">
<th>Make</th>
<th>Model</th>
<th>Body Type</th>
<th>Engine</th>
<th>Year</th>
<th>Specifications</th>
</tr>
<tr>
<td>
<domino:item name="make"/>
</td>
<td>
<domino:item name="model"/>
</td>
<td>
<domino:item name="bodytype"/>
</td>
<td>
<domino:item name="enginetype"/>
</td>
<td>
<domino:item name="year"/>
</td>
<td>
<domino:item name="specifications" format="<LI>"/>
</td>
</tr>
</table>
</domino:document>
</body>
</html>
|
<domino:document> 標簽可以顯示 Notes 文檔的內容。使用這個標簽,您的代碼可以訪問一個特定文檔的所有項目和屬性。在某些情況中,您可能希望為文檔標簽中的 dbserver、dbname 和 unid 屬性傳遞值。注意在我們的例子中不會這樣做。原因是由于必需的信息早已在其他地方指定了。服務器的主機名和數據庫的文件名早已在 Web 部署描述符(web.xml)中定義了。UNID 是在查詢字符串參數 unid 中隱式指定的。
如果由于某些原因,您不想在 URL 中暴露這個 UNID,那么就必須在 unid 屬性中明確地說明文檔標簽。
<%
String unid = [[code that obtains the document unid]];
%>
<domino:document unid=’<%= unid %>’>
|
<domino:item> 標簽顯示了在 name 屬性中指定的項目的內容。例如,<domino:item name="make"/> 顯示了保存在 make 項中的值。引用 specifications 字段的最后一個標簽具有一個 format 屬性。這個屬性告訴標簽庫如何顯示 JSP 中的值。為這個屬性提供的值稱為關鍵字(keyword)。在一個 format 屬性中,可以使用多個關鍵字。
回想一下,specifications 字段是一個多值字段;它可以包含多個值。<li> 關鍵字告訴 <domino:item> 標簽對 <li> 和 </li> 標簽中的內容自動進行換行。
顯示視圖的內容
Domino 視圖可以通過 <domino:view> 標簽進行訪問。例如,在我們的 car 的例子中,有一個簡單的視圖 Cars\By VIN,它有兩列:vin 和 make。這個視圖還有一個別名 vins,這就是我們在視圖標簽中要引用的內容。 圖 5. Notes 客戶機顯示 VINs 視圖
下面是用來將 VINs 視圖顯示為 HTML 文件的 JSP 代碼。
<%@ taglib uri="domtags.tld" prefix="domino" %>
<%@page import="lotus.domino.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<%
String count = "30";
if(request.getParameter("count")!=null);
count = (String)request.getParameter("count");
%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Car List using Domino Tag Library</title>
</head>
<body>
<h1>Car List using Domino Tag Library</h1>
<domino:db>
<table border="1">
<tr bgcolor="#ffcccc">
<th>
VIN
</th>
<th>
Make
</th>
<th>
Model
</th>
</tr>
<domino:view viewname="vins" max="<%= count %>">
<domino:viewloop>
<tr>
<td>
<domino:formlink href="disptagcar.jsp" >
<domino:viewitem name="vin" />
</domino:formlink>
</td>
<td>
<domino:viewitem name="make" />
</td>
<td>
<domino:item name="model" />
</td>
</tr>
</domino:viewloop>
</domino:view>
</table>
</domino:db>
</body>
</html>
|
圖 6. JSP 顯示 VINs 視圖的內容
查看視圖的 JSP
下面讓我們考查一下上面這個 JSP。在下一節(jié)我們將使用這個 JSP 來構建一個搜索頁面。
<domino:item> 和 <domino:viewitem> 之間的區(qū)別如下:<domino:item> 必須打開文檔才能檢索值,而 <domino:viewitem> 則使用視圖中顯示的值。只要可能,在 viewloop 的上下文中就應該避免使用 item 標簽,因為這樣可能會造成嚴重的性能問題。
視圖搜索
在本節(jié)中,我們將討論如何修改所創(chuàng)建的視圖 JSP,從而讓它可以支持搜索功能。
要正確使用全文搜索功能,必須激活 Domino 數據庫的全文索引。要查看一個數據庫是否進行了索引,請打開 Database Properties 對話框,并點擊 Search 選項卡。如果數據庫沒有進行索引,那么就點擊 Create Index 按鈕。Notes 客戶機的狀態(tài)條會告訴您這個請求是否已經排入了隊列。全文索引通常很快就可以建好。 圖 7. 數據庫全文索引屬性選項卡
我們的搜索表單會包含這三個字段用于一個可定制的搜索:查詢,返回結果的最大個數,結果頁面中每頁顯示的個數。我們使用上一節(jié)中的視圖 JSP 作為這個 JSP 的基礎。
下面是這個 JSP 代碼中處理搜索功能的部分:
<domino:view viewname="vins" ftsearch=‘<%= query %>‘ max=‘<%= max %>‘>
<domino:page rows=‘<%= count %>‘>
<tr><td colspan="3" align="right">Go to page:
<domino:pagebar navstyle="NextPrev" />
<domino:pagenext>Next></domino:pagenext></td></tr>
<domino:viewloop>
<tr>
<td>
<domino:formlink href="disptagcar.jsp" >
<domino:viewitem name="vin" />
</domino:formlink>
</td>
<td>
<domino:viewitem name="make" />
</td>
<td>
<domino:item name="model" />
</td>
</tr>
</domino:viewloop>
<domino:novalues>
<tr>
<td>
The search for <%= query %> found no matches. Use another keyword and try again.
</td>
</tr>
</domino:novalues>
<tr><td colspan="3" align="right">Go to page:
<domino:pagebar navstyle="NextPrev" />
<domino:pagenext>Next></domino:pagenext></td></tr>
</domino:page>
</domino:view>
|
查看 Search 視圖的 JSP
下面讓我們更詳細地查看一下 Search 視圖的 JSP。
- View
要構建一個搜索視圖,我們只能添加兩個屬性到 <domino:view> 標簽中:ftsearch 和 max。ftsearch 是查詢的字符串,max 是要返回的結果的最大個數。
- Page
這個標簽為顯示視圖內容和搜索結果提供了分頁控制。它的行屬性限制了一個頁面中的項數。這個標簽為提供導航特性的標簽提供了內容。
- Pagebar
在 page 標簽的上下文中,<domino:pagebar> 可以自動生成到搜索結構的頁面的鏈接。這些到當前頁面的鏈接是粗體的,而且是不能點擊的。
- Pagenext
這個標簽自動生成了到下一個頁面的鏈接。這個標簽的主體就是該鏈接的文本標簽。在這種情況中,我們使用 Next >。您可以將這個標簽與 pagebar 一起使用,從而創(chuàng)建一個類似于圖 8 所示的頁面導航系統(tǒng)。 圖 8. 導航條
- Novalues
這個標簽的主題是在搜索不返回任何結果時所顯示的文本。在我們的例子中,會顯示消息“The search for [query] found no matches. Use another keyword and try again.”
表單
在這最后一節(jié)中,我們會創(chuàng)建一個 JSP 表單,用戶可以使用這個表單來創(chuàng)建并修改 Notes 文檔。出于簡單性的考慮,我們的示例數據庫允許匿名作者訪問。在真實生活中的應用程序中,安全性實在是要關注的一個問題,更明智的方法是使用一個集中的用戶注冊(例如 LDAP),并采用單點登錄(SSO)功能。將 WebSphere 設置為一個可信的容器,為 Lotus Domino 處理授權和認證的功能。有關 WebSphere 和 Lotus Domino 的 SSO 的更多信息,請參閱 WebSphere Application Server InfoCenter。
我們的表單提供了以下特性:
- 允許用戶創(chuàng)建文檔。顯示一條消息說明用戶正在創(chuàng)建一個新文檔。
- 允許用戶編輯現有的文檔。顯示一條消息說明用戶正在修改一個現有的文檔。
- 對輸入信息進行有效性驗證。如果有效性驗證失敗,就顯示定制的錯誤消息。
- 當用戶成功提交表單時,將用戶重定向到一個感謝頁面上。
這個 Form JSP 的詳細代碼,請參閱“Form JSP 代碼”。
form 標簽
<domino:form> 標簽提供了對指定文檔的編輯訪問能力。它可以支持很多用來支持高級操作主機的屬性。在我們的例子中,使用了更通用的一些屬性。下面讓我們仔細查看一下:
- Name
這是表單對象的名字。其值會被用作 HTML 表單名。該值在每個 JSP 中都是惟一的。
- Schema
這個值對應于 Domino 表單的名字,這個文檔應該使用這個名字進行保存。對這個表單會執(zhí)行 Domino 表單的保存前處理(QuerySave)操作。設置這個值還會隱式地將其放入該文檔的 form 字段中。
- Editmode
這個屬性接受 3 個值:display、edit 和 delete。雖然您可以為這個屬性設置固定的值,但是可能最有用的方式是,根據代碼中的邏輯、以編程的方式給這個屬性賦值。
- Validhref
這個值是您希望在對表單進行有效性驗證并保存之后將用戶重定向到的頁面。
- Clientvalidate
將這個值設置為 true 會導致對表單根據 validation 標簽對用戶輸入進行有效性驗證。反之,將該值設置為 false 會導致該表單忽略所有的 validation 標簽。
- User
指定正在訪問 Domino 數據的用戶名。當使用 J2EE 容器進行認證時,請將該值設置為 *webuser。有關 taglib 安全性的詳細信息,請參閱 Domino Designer Help。
- Unid
如果在 JSP 查詢字符串中有一個 unid 參數,那么 form 標簽就會使用這個 unid 來打開一個文檔。您也可以在 unid 屬性中傳遞這個 unid。
- Input 標簽
input 標簽創(chuàng)建 HTML 的輸入字段。name 屬性指明該項要保存的值。默認情況下,數據類型是 text。在需要其他數據類型的情況中,請指定數據類型屬性來匹配表單模式中的字段。對于多值字段來說,要設置 multivalue="true",并使用 mveditseparator 和 mvdisplayseparator 指定值的分隔符。在我們的例子中,使用了逗號來分隔要編輯的值,使用分號來分隔要顯示的值。
- Validation 標簽
這些標簽負責在保存表單之前對輸入信息進行有效性驗證。Lotus 提供了很多 validation 標簽來對不同的數據類型進行有效性驗證。在我們的例子中,使用更通用的一些標簽:validaterequired 和 validatepattern。您可以對每個字段使用多個 validation 標簽。
現在,讓我們來查看一下使用的 validation 標簽:
- Validatesummary
這個標簽顯示了檢測有效性驗證失敗的 validation 標簽的 message 屬性的值。將這個標簽放到表單的頂部,這樣用戶就可以對自己是否填寫了表單而一覽無余了。
- Validaterequired
這個標簽確定 name 屬性中的字段是否為空。如果非空,那就會在頁面上顯示這個標簽的主體。將這個標簽放到下一個字段中,從而精確地說明用戶應該重點注意哪些內容。
- Validatepattern
在基本的 validation 標簽不夠用的地方,可以使用這個標簽來創(chuàng)建用戶定制的有效性驗證規(guī)則。這個標簽的核心依賴于 Apache 的 regexp 庫對用戶輸入的值進行有效性驗證。構建一個說明所期望值格式的正則表達式,并將其放到 pattern 屬性中。然后這個標簽就會將用戶輸入的數據與正則表達式進行比較。在我們的例子中,validatepattern 標簽會檢查 year 字段是一個數字類型,有 4 個字符長。
document 標簽
<domino:document> 標簽提供了對 Notes 文檔本身的訪問能力。id 屬性的存在標記著 taglib 分配一個名稱為 id 標簽中的值的 lotus.domino.Document 對象。在我們的例子中,這個對象是 doc。這為程序員提供了完全編程訪問該對象的屬性和方法的能力;在普通的 Java 代碼中可以對 taglib 進一步地擴展使用。這個功能強大的工具在 taglib 中的大部分標簽中都可以使用。要學習更多有關 Domino Java 類的知識,請參閱 Domino Designer Help。
結束語
在本文中,我們討論了如何使用 Domino JSP 標簽庫進行編程,從而構建功能強大的啟用 Domino 的 J2EE 應用程序。通過幾個例子,我們討論了最常用的標簽,并詳細介紹了它們背后的概念。本系列文章中介紹的內容應該可以幫助您在現有的 Domino 環(huán)境中采用 J2EE 技術。
|