在 IBM Lotus Domino Designer 中使用 Java 構建應用程序


 

簡介: 本文旨在幫助那些傳統的 LotusScript 開發人員轉向 Java 開發。在幾乎不具備 Java 知識的情況下,本文可幫助您開始在 IBM Lotus Domino 中進行 Java 應用程序開發。

簡介

對於 IBM Lotus Notes 應用程序開發人員來說,LotusScript 和 LotusScript 類在設計 Notes 應用程序時很有用。LotusScript API 支持以編程方式與數據庫、文檔,甚至設計元素進行交互。隨着 Java 發展成為主流編程語言,原來越多的 Notes 應用程序開發人員開始將目光投向 Java。

本文面向那些想要在 IBM Lotus Domino 中使用 Java 進行編程的 LotusScript 開發人員。假定讀者具有一定的 LotusScript 編程經驗。

本文包含三部分:Java 語言、示例和其他要素。Java 編程人員可以直接跳到示例部分,但是新手應該從 Java 語言部分開始閱讀。


Java 語言

發布於 1995 年,Java 是一種面向對象的編程語言,它的出現滿足了平台獨立性需求。這是通過將 Java 源代碼編譯成字節碼實現的,然后任意平台上的任何 Java 虛擬機(JVM)都可以解釋字節碼。

因此,只要為目標平台實現了 JVM,就可以運行任何 Java 應用程序。有關更多信息,請參見 “The History of Java Technology”。

Java 的語法類似於 C,而它面向對象的實現方式類似於 C++,因此 C/C++ 編程人員可以輕松掌握 Java。但是,LotusScript 開發人員可能會發現 Java 語法與 LotusScript 大不相同。

由於本文關注的是在 Lotus Domino 中使用 Java,因此所展示的示例也將在 Lotus Domino 的環境中實現。

我們從經典的 “Hello World” 示例開始。在 Domino Designer 中創建新的 Java 代理時,會收到表 1 左欄所示的模板代碼。右欄的代碼已經進行了修改以適應 “Hello World” 示例的需要。


表 1. Hello World 示例
模板 Java 代理代碼 Hello World Java 代理代碼
 import lotus.domino.*; 
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext=
session.getAgentContext();

// (Your code goes here)

} catch(Exception e) {
e.printStackTrace();
}
}
}

 import lotus.domino.*; 
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext=
session.getAgentContext();

// (Your code goes here)

System.out.println("Hello World!");
} catch(Exception e) {
e.printStackTrace();
}
}
}

逐行詳解

我們來逐行看一下這段代碼:

import lotus.domino.*;

Java 使用 import 語句以包括其他 Java 類。在本例中,所有 lotus.domino 類對於代理代碼都可用。Java 類通常包含在 JAR 文件中。代理可以通過幾種方式使用 JAR 文件。有關 JAR 文件的信息,請參閱本文第 4 節 “將外部 JAR 文件與 Java 代理一起使用” 部分。

public class JavaAgent extends AgentBase {

Java 是一種面向對象的編程語言。該行證明了這一點,創建 Java 代理時,它創建了 JavaAgent 類,這是在其中編寫 Java 代碼的主類。

可能還注意到了 JavaAgent 類擴展了 AgentBase 類。因為 Java 是面向對象的,所以擴展 AgentBase 類為我們提供了進入代理的入口點,這將我們帶到了下一行。

public void NotesMain() {

NotesMain 方法是到代理的入口點。這里我們用自己的定義改寫了 AgentBase 方法定義。

try {

在 Java 中,錯誤處理通過 try 和 catch 塊進行處理。Java 中拋出異常的方法必須囊括在 try 塊中,而且每一個 try 塊都必須有一個相應的 catch 塊。在 “Hello World” 示例中需要 try 和 catch 塊,因為 getAgentContext 方法拋出了 NotesException。要查看哪些 Domino 方法拋出異常,請參閱 Domino Designer 幫助文件中的方法簽名。

Session session = getSessiono;

AgentBase 類的 getSession 方法用於創建會話對象。Java Session 類類似於 LotusScript NotesSession 類。

AgentContext agentContext = session.getAgentContexto;

AgentContext 類用於獲取到當前數據庫的句柄(使用其 getCurrentDatabase 方法)。在 LotusScript 中,不需要使用這個額外的類來獲取到當前數據庫的句柄。

//(Your code goes here)

這一行要注意的是單行注釋以 “//” 開頭。多行注釋在開始和結尾處使用 “/*”(類似於 C++)。

System.out.println("Hello World!");

這是用於輸出到控制台的 Java 方法。要在 Notes 中打開 Java 控制台,從菜單中選擇 Tools > Show Java Debug Console。System.out.println 方法類似於 LotusScript Print 方法。

} catch(Exception e) {

這是與上文 try 代碼塊相對應的 catch 語句。

e. pri ntStackTraceo;

在 catch 代碼塊中,可以按照自己的意願處理異常;在本例中,我們只是將其輸出到堆棧跟蹤。

Java 語言基礎知識

Java 提供了 8 種基本類型:byte、short、int、long、char、float、double 和 Boolean。 表 2 介紹了每種類型並指出了相對應的 LotusScript 的等價物(如果有)。


表 2. 基本類型和 LotusScript 等價物
Java 基本類型 Java 說明 LotusScript 等價物
byte 正負 8 位二進制補碼整數(-128 到 127) Byte
相似點:8 位
不同點:無負數(0 到 255)
short 正負 16 位二進制補碼整數(-32,768 到 32,767) Integer
相似點:16 位,有正負(-32,768 到 32,767)
int 正負 32 位二進制補碼整數(-2,147,483,648 到 2,147,483,647) Long
相似點:32 位,有正負(-2,147,483,648 到 2,147,483,647)
long 正負 64 位二進制補碼整數(-9,223,372,036,854,775,808 到
9,223,372,036,854,775,807)
N/A
char 單個 16 位 Unicode 字符 N/A
但是, LotusScript 提供了一個 String 類型,它包含多個字符
float 單精度 32 位 IEEE 754 浮點 Single
相似點:單精度 32 位浮點
double 雙精度 64 位 IEEE 754 浮點 Double
相似點:雙精度 64 位浮點
Boolean true 或 false 值 Boolean
相似點:true 或 false 值

運算符

Java 具有豐富的運算符集。表 3 只是顯示了其運算符的一部分並提供了說明和 LotusScript 的等價物(如果有)。有關完整列表,請訪問 Java 教程運算符頁面


表 3. Java 運算符
Java 算術運算符 說明 LotusScript 等價物
= 賦值 =
~ ~
~~ 遞增 N/A
+= 加法賦值 N/A
­- 減(也是一元減運算符) -
-- 遞減 N/A
-= 減法賦值 N/A
* *
*= 乘法賦值 N/A
/ /
/= 除法賦值 N/A
% 求余數 Mod
%= 求余數賦值 N/A

Java 關系運算符 說明 LotusScript 等價物
== 相等 =
!= 不等於 <>, ><
> 大於 >
>= 大於等於 >=, =>
< 小於 <
<= 小於等於 <=, =<

Java 邏輯(位)運算符 說明 LotusScript 等價物
& 按位與 And
I 按位或 Or
A 按位異或 Xor
- 按位求補 Not
>> 帶有符號擴展的右移位 N/A
<< 左移位 N/A

Java 邏輯(布爾)運算符 說明 LotusScript 等價物
&& 布爾與 And
II 布爾或 Or
== 布爾等於 Eqv
! 布爾非 Not

聲明變量

Java 中聲明變量的語法是類型,后面接着變量名:

類型 variable_name;

在 Java 中,變量名由字母、數字和下划線組成。變量名是區分大小寫的並且不能以數字開頭。

Java LotusScript
int i; Dim i as Integer
String s; Dim s as String

創建函數

關於函數語法,LotusScript 和 Java 有兩個主要的不同之處。首先,返回類型放在函數名前面(這與 LotusScript 相反,在 LotusScript 中返回類型放在末尾);第二,Java 使用返回關鍵字從函數返回值(請參見清單 1)。


清單 1. 創建函數示例

return _type function_name(parameter_type 1 parameter_name 1,
parameter_type2 parameter_name2)
{
// 函數代碼 ...
return return_type_object;
}

Java LotusScript
 public int product(int x, int y) 
{
return x*y;
}

 Function product(x As Integer, y As Integer) As Integer 
product = x * y
End Function

Calling the function:
 int i = product(2,4); 
System.out.println(i);

Calling the function:
 Dim i As Integer 
i = product(2, 4)
Print i


創建類

Java 中創建類的語法與 LotusScript 中的類似。它們都使用帶有 private/public 選項的類關鍵字,並且都支持類成員以及類方法。但是,需要注意 LotusScript 類構造方法使用 New 關鍵字,而 Java 使用無參數的類名稱(請參見清單 2 和表 4)。


清單 2. 創建類示例

class class_name
{
type class_member1;
type class_member2;
....

class _name() // 構造方法
{
// 構造方法代碼
}

return _type class_method1 (parameter list)
{
// 方法代碼
}

return _type class_method2(parameter list)
{
// 方法代碼
}
....

}


表 4. 創建類
Java LotusScript
 public class Person 
{
private String Name;
private int Age;

public Person()
{
this.Name="";
this.Age=0;
}

public void SetName(String name)
{
this.Name = name;
}

public String GetName()
{
return this.Name;
}

public void SetAge(int age)
{
this.Age = age;
}

public int GetAge()
{
return this.Age;
}

public void AddYears(int i)
{
this.Age = this.Age + i;
}
}

 Public Class Person 
Private PName As String
Private PAge As Integer

Sub New
PAge = 0
PName = ""
End Sub

Public Property Set Person_Name As String
PName = Person_Name
End Property

Public Property Get Person_Name As String
Person_Name = PName
End Property

Public Property Set Age As Integer
PAge = Age
End Property

Public Property Get Age As Integer
Age = PAge
End Property

Sub AddYears (i As Integer)
PAge = PAge + i
End Sub

End Class

創建類的實例 :

 Person p = new Person(); 
p.SetName("John Doe");
p.SetAge(20);
System.out.println(p.GetName() + " " +p.GetAge());
p.AddYears(5);
System.out.println(p.GetName() + " " +p.GetAge());

創建類的實例 :

 Dim p As New Person 
p.Person_Name = "John Doe"
p.Age = 20
Messagebox p.Person_Name & " " & Cstr(p.Age)
p.AddYears(5)
Messagebox p.Person_Name & " " & Cstr(p.Age)

流控制語句

要控制腳本流動,Java 提供了您希望從編程語言中獲得的所有標准流控制語句。表 5 列出了 Java 最常用的流控制語句及其 LotusScript 等價物。有關 Java 流控制語句的更多信息,請訪問Java 教程控制流語句頁


表 5. Java 流控制語句
Java 流控制語句 LotusScript 等價物
 if (condition) { 
//perform these statements
}

 If condition Then 
'perform these statements
End If

 if (condition) { 
//perform these statements
}
else {
//perform these statements
}

 If condition Then 
'perform these statements
Else
'perform these statements
End If

 switch (expr) { 
case c1:
//perform these statements if expr == c1
break;
case c2:
//perform these statements if expr == c2
break;
. . .
default:
//perform these statements if
//expr != anyof cases
}

 Select Case expr 
Case c1
'perform these statements if expr = c1
Case c2
'perform these statements if expr = c2
...
Case Else
'perform these statements if
'expr <> anyof the cases
End Select

 while (condition) { 
//perform these statements
}

 While condition 
'perform these statements
Wend

 do { 
//perform these statements
} while (condition);

 Do While condition 
'perform these statements
Loop

 for (initialization; termination; increment) { 
//perform these statements
}

 For countVar = first To last 
'perform these statements
Next

LotusScript 與 Java 語言的不同之處

LotusScript 與 Java 的類似之處在於它們都是面向對象的編程語言。除語法外,兩種語言之間一個主要不同是 Java 是強類型的,而 LotusScript 不是。

在 Java 中,必須在使用之前聲明所有變量(名稱和類型)。在 LotusScript 中沒有這樣的要求,盡管也有一些類型增強。

另一個主要不同是 Java 區分大小寫,而 LotusScript 不區分。編寫 Java 代碼時要記住這一點,因為 p 和 P 是兩個不同的變量,而 setName 和 SetName 是兩個不同的方法。

特定於 Domino 的不同

盡管名稱不同,但是大部分為 LotusScript 提供的 Domino 類在 Java 中都能找到。在 LotusScript 中,Domino 類以 “Notes” 開頭;例如,用於處理數據庫的類是 “NotesDatabase”,而針對文檔的類是 “NotesDocument”。

另一方面,在 Java 中,類名稱不以 “Notes” 開頭。因此,處理數據庫的類就是 “Database”,而針對文檔的類是 “Document”。

LotusScript 與 Java Domino 類之間的主要不同是 UI 類。 LotusScript 提供了以下類,用於 UI 交互:

NotesU IWorkspace、NotesU I Database、NotesU I Document 和 NotesU IView

這些類使您能與 Notes 中當前打開的數據庫、文檔或視圖進行交互。但是在 Java 中就沒有等價的 UI 類。有關 Java Domino 類的完整列表,請參閱Domino Designer 幫助文件


示例

我們來看一些使用 LotusScript 執行的常見任務,研究一下如何在 Java 中進行對等操作。第一個例子是發送電子郵件消息。

示例 1:發送電子郵件

花一分鍾時間來研究一下下面清單 3 中的 LotusScript 代碼:


清單 3. 示例 LotusScript 發送電子郵件代碼

1 Dim session As New NotesSession
2 Dim database As NotesDatabase
3 Dim email As NotesDocument
4 Dim sendto As String
5 Dim subject As String
6 Dim body As String
7 Set database = session.CurrentDatabase
8 Set email = database.CreateDocument
9 sendto = "Enter _Email _Address _Here"
10 subject = "Email sent by LotusScript code"
11 body = "Text in body of email sent by LotusScript code"
12 Call email.ReplaceItemValue("Form", "Memo")
13 Call email.ReplaceItemValue("SendTo", sendto)
14 Call email.ReplaceItemValue("Subject", subject)
15 Call email.ReplaceItemValue("Body", body)
16 Call email.Send(False)

現在我們在 Java 中為以上示例編碼,從為我們提供的 Java 模板代碼開始(請參見清單 4)。


清單 4. Java 模板代碼

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

} catch(Exception e) {
e.printStackTrace();
}
}
}

在上面清單 3 中 LotusScript 示例的第 1 到 6 行,我們聲明了變量 session、database、email、sendto、subject 和 body。因為模板代碼已經為我們提供了 session 對象,我們來聲明其余的變量(請參見 5)。


清單 5. 聲明其余變量

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

Database database;
Document email;
String sendto;
String subject;
String body;
} catch(Exception e) {
e.printStackTrace();
}
}
}

在清單 3 的第 7 到 11 行,我們初始化 database、email、sendto、subject 和 body 變量(請參見清單 6)。如前面所述,必須使用 agentContext 對象而不是 session 對象來獲取到當前數據庫的句柄。另外,在 Java 中不需要 Set 關鍵字來設置變量。


清單 6. 初始化變量

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

//(Your code goes here)

Database database;
Document email;
String sendto;
String subject;
String body;
database = agentContext.getCurrentDatabase();
email = database.createDocument();
sendto = "Enter _Email _Address _Here";
subject = "Email sent by Java code";
body = "Text in body of email sent by Java code";
} catch(Exception e) {
e.printStackTrace();
}
}
}

在清單 3 的第 12 到 15 行,我們替換了 Form、SendTo、Subject 和 Body 字段的值,並在第 16 行發送了電子郵件。注意調用方法時,Java 不需要 Call 關鍵字(請參見清單 7)。

另外,盡管 replaceItemValue 和 send 方法在 LotusScript 和 Java 中的拼寫一樣,您也必須記住在 Java 中要使用正確的大小寫(因為 Java 區分大小寫)。


清單 7. 設置相應字段並發送電子郵件

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

Database database;
Document email;
String sendto;
String subject;
String body;
database = agentContext.getCurrentDatabase();
email = database.createDocument();
sendto = "Enter _Email _Address _Here";
subject = "Email sent by Java code";
body = "Text in body of email sent by Java code";
email.replaceItemValue("Form", "Memo");
email.replaceItemValue(" SendTo", sendto);
email.replaceItemValue(" Subject", subject);
email.replaceItemValue("Body", body);
email. send(false);
} catch(Exception e) {
e.printStackTrace();
}
}
}

LotusScript 中代碼到此結束了,但是在 Java 代理中還有一些工作要做。特別是,在 Java 中,我們必須對所有 Domino 對象調用 recycle(請參見清單 8)。調用 recycle 確保分配給這些對象的內存都得以釋放。有關 recycle 方法的更多信息,請參見第 4 部分的“recycle() 方法”一段。


清單 8. 對 Domino 對象調用 recycle

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

//(Your code goes here)

Database database;
Document email;
String sendto;
String subject;
String body;
database = agentContext.getCurrentDatabase();
email = database.createDocument();
sendto = "Enter_Email_Address_Here";
subject = "Email sent by Java code";
body = "Text in body of email sent by Java code";
email.replaceItemValue("Form", "Memo");
email.replaceItemValue(" SendTo", sendto);
email.replaceItemValue(" Subject", subject);
email.replaceItemValue("Body", body);
email. send(false);

//recycle Java Domino objects
if (session !=null)
session.recycle();
if (agentContext !=null)
agentContext.recycle();
if (database !=null)
database.recycle();
if (email !=null)
email.recycle();
} catch(Exception e) {
e.printStackTrace();
}
}
}

表 6 匯總了兩種語言的比較。


表 6. 示例 1 兩種語言之間的比較
LotusScript Java

示例 1:發送電子郵件

 Dim session As New NotesSession 

Dim database As NotesDatabase
Dim email As NotesDocument
Dim sendto As String
Dim subject As String
Dim body As String

Set database = session.CurrentDatabase
Set email = database.CreateDocument
sendto = "Enter_Email_Address_Here"
subject = "Email sent by LotusScript code"
body = "Text in body of email sent byLotusScript code"

Call email.ReplaceItemValue("Form", "Memo")
Call email.ReplaceItemValue("SendTo", sendto)
Call email.ReplaceItemValue("Subject", subject)
Call email.ReplaceItemValue("Body", body)
Call email.Send(False)

示例 1:發送電子郵件

 Session session = getSession(); 
AgentContext agentContext =session.getAgentContext();

Database database;
Document email;
String sendto;
String subject;
String body;

database = agentContext.getCurrentDatabase();
email = database.createDocument();
sendto = "Enter_Email_Address_Here";
subject = "Email sent by Java code";
body = "Text in body of email sent by Javacode";

email.replaceItemValue("Form", "Memo");
email.replaceItemValue("SendTo", sendto);
email.replaceItemValue("Subject", subject);
email.replaceItemValue("Body", body);
email.send(false);

//recycle Java Domino objects
if (session !=null)
session.recycle();
if (agentContext !=null)
agentContext.recycle();
if (database !=null)
database.recycle();
if (email !=null)
email.recycle();

示例 2:循環通過 Notes 視圖

第二個示例中,我們將循環通過 Notes 視圖(請參見清單 9)。盡管很簡單,該實例在 Java 中編碼時卻很重要,因為它證實了恰當地使用 recycle 方法可以防止內存異常。


清單 9. 用於循環通過視圖的 LotusScript 代碼

1 Dim session As New NotesSession
2 Dim database As NotesDatabase
3 Dim view As NotesView
4 Dim document As NotesDocument
5 Set database = session.CurrentDatabase
6 Set view = database.GetView("Enter _View _Name _Here")
7 Set document = view.GetFirstDocument
8 While (Not document Is Nothing)
'Process the document
9 Print document.Created
10 Set document = view.GetNextDocument(document)
11 Wend

以 Java 模板開始,先聲明 database、view 和 document 變量(清單 4 中 LotusScript 代碼第 1--4 行)。除了這三個變量以外,我們還需要臨時的 Document。在 while 循環通過中需要臨時 Document 變量來回收當前文檔(請參見清單 10)。


清單 10. 聲明 database、view 和 document 變量

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

//(Your code goes here)

Database database; View view;
Document document; Document temp;
} catch(Exception e) {
e.printStackTrace();
}
}
}

繼續到第 5--7 行(請參見清單 9),我們來初始化 database、view 和 document 變量,如清單 11 所示。


清單 11. 初始化 database、view 和 document 變量

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

//(Your code goes here)

Database database;
View view;
Document document;
Document temp;
database = agentContext.getCurrentDatabase();
view = database.getView("Enter_View_Name_Here");
document = view.getFirstDocument();
} catch(Exception e) {
e.printStackTrace();
}
}
}

在清單 9 的 8 — 11 行,我們循環通過視圖中的每個文檔。對於這個循環,Java 具有相同的 while 關鍵字;但是必須使用 != 而不是 Not,並且使用 null 來替代 Nothing(請參見清單 12)。

另外,如果我們要在 Java 中為相同的 Domino 變量多次賦值,則需要在賦新值之前對其調用 recycle ,以防止內存泄露(因此需要 temp 變量)。


清單 12. 循環通過視圖中的每個文檔

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

//(Your code goes here)

Database database;
View view;
Document document;
Document temp;
database = agentContext.getCurrentDatabase();
view = database.getView("Enter_View_Name_Here");
document = view.getFirstDocument();
while (document != null) {
//Process the document
System.out.println(document.getCreated());
temp = view.getNextDocument(document); // get the next document
document.recycle(); // recycle the document we're done with
document = temp;
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

通過對我們創建的所有其他 Domino 對象調用 recycle 包裝(wrap up)此示例,如清單 13 所示。


清單 13. 對所有其他 Domino 對象調用 recycle

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

Database database;
View view;
Document document;
Document temp;
database = agentContext.getCurrentDatabase();
view = database.getView("Enter_View_Name_Here");
document = view.getFirstDocument();
while (document != null) {
//Process the document
System.out.println(document.getCreated());
temp = view.getNextDocument(document); // get the next document
document.recycle(); // recycle the document we're done with
document = temp;
}
if (session !=null)
session.recycle();
if (agentContext !=null)
agentContext.recycle();
if (database !=null)
database.recycle();
if (view != null)
view.recycle();
} catch(Exception e) {
e.printStackTrace();
}
}
}

表 7 匯總了兩種語言的比較。


表 7. 示例 2 兩種語言之間的比較
LotusScript Java

示例 2:循環通過 Notes 視圖

 Dim session As New NotesSession 

Dim database As NotesDatabase
Dim view As NotesView
Dim document As NotesDocument

Set database = session.CurrentDatabase
Set view = database.GetView("Enter_View_Name_Here")
Set document = view.GetFirstDocument

While (Not document Is Nothing)
'Process the document
Print document.Created
Set document = view.GetNextDocument(document)
Wend

示例 2:循環通過 Notes 視圖

 Session session = getSession(); 
AgentContext agentContext = session.getAgentContext();

Database database;
View view;
Document document;
Document temp;

database = agentContext.getCurrentDatabase();
view = database.getView("Enter_View_Name_Here");
document = view.getFirstDocument();

while (document != null){
//Process the document
System.out.println(document.getCreated());

// get the next document
temp = view.getNextDocument(document);

// recycle the documentwe're done with
document.recycle();
document = temp;
}

if (session !=null)
session.recycle();
if (agentContext !=null)
agentContext.recycle();
if (database !=null)
database.recycle();
if (view != null)
view.recycle();


示例 3:用郵件數據庫信息生成報告

最后一個示例使用廣泛。這里我們循環通過 Domino 服務器上的郵件數據庫並用來自每個郵件文件的各個項創建一個電子郵件報告。首先,花些時間看一下清單 14 中的 LotusScript 示例。


清單 14. LotusScript 代碼示例

1 Dim session As New Notessession
2 Dim nab As New Notesdatabase("Enter_Server_Name_Here", "names.nsf")
3 Dim reportDatabase As Notesdatabase
4 Dim personDocument As NotesDocument
5 Dim report As NotesDocument
6 Dim view As NotesView
7 Dim temp As String

8 Set reportDatabase = session.CurrentDatabase
9 Set report = reportDatabase.CreateDocument

10 Call report.ReplaceItemValue("Form" , "Memo")
11 Call report.ReplaceItemValue("Subject" , "Mail Applications Report")

12 Dim richTextItem As New NotesRichTextItem(report, "Body")
13 Set view = nab.GetView("People")
14 Set personDocument = view.GetFirstDocument
15 While Not personDocument Is Nothing
16 On Error Resume Next
17 Dim mailDatabase As New NotesDatabase(personDocument.mailserver(0),
personDocument.mailfile(0))
18 If mailDatabase.IsOpen Then
19 temp = "Mail Owner: " & personDocument.fullname(0) & " Size: " &
Cstr(mailDatabase.size) & " _ bytes Template: "
+ mailDatabase.DesignTemplateName
20 Else
21 temp = "Could not open mail file for: " & personDocument.fullname(0) &
" Server: " & personDocument.mailserver(0) & " , "
& personDocument.mailfile(0)
22 End If

23 richTextItem.AppendText(temp)
24 richTextItem.AddNewline( 1)
25 temp = ""
26 Set personDocument = view.GetNextDocument(personDocument)
27 Wend

28 Call report. Send(False, "Enter_Email_Address_Here")

我們從第 1--7 行開始(在清單 14 中),聲明需要的變量,然后初始化 nab Database 變量。在 Java 中,注意必須使用 session 對象來設置 nab(請參見清單 15)。


清單 15. 聲明變量

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

Database nab;
nab = session.getDatabase("Enter_Server_Name_Here","names.nsf");
Database reportDatabase;
Document personDocument;
Document report;
Document tempDocument;
View view;
String temp;
} catch(Exception e) {
e.printStackTrace();
}
}
}

LotusScript 第 8--14 行(清單 14 中)與 Java 等價代碼之間最大的不同之處是 RichTextItem 類;在 Java 中,需要使用 Document 類的 createRichTextItem 方法來創建富文本字段(請參見清單 16)。


清單 16. 初始化變量並創建報告電子郵件

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

Database nab;
nab = session.getDatabase("Enter_Server_Name_Here","names.nsf");
Database reportDatabase;
Document personDocument;
Document report;
Document tempDocument;
View view;
String temp;
reportDatabase = agentContext.getCurrentDatabase();
report = reportDatabase.createDocument();
report.replaceItemValue("Form" , "Memo");
report.replaceItemValue("Subject" , "Mail Applications Report");
RichTextItem richTextItem;
richTextItem = report.createRichTextItem("Body");
view = nab.getView("People");
personDocument = view.getFirstDocument();
} catch(Exception e) {
e.printStackTrace();
}
}
}

在清單 14 的第 15--27 行,我們在 while 循環中完成了大量工作。在 Java 中,我們使用 try/catch 塊進行錯誤處理,而不像在 LotusScript 中那樣使用 On Error 語句。因為 getDatabase 方法可能拋出異常,我們利用 catch 塊來設置 temp 字符串變量(請參見清單 17)。

在 Java 中要記住的另一件事是重用 Domino 變量時要在循環內使用 recycle 方法。在這個特殊的 while 循環中,我們必須記住在每次新的賦值之前回收 mailDatabase 和 personDocument。


清單 17. 收集郵件數據庫信息

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

Database nab;
nab = session.getDatabase("Enter_Server_Name_Here","names.nsf");
Database reportDatabase;
Document personDocument;
Document report;
Document tempDocument;
View view;
String temp;
reportDatabase = agentContext.getCurrentDatabase();
report = reportDatabase.createDocument();
report.replaceItemValue("Form" , "Memo");
report.replaceItemValue("Subject" , "Mail Applications Report");
RichTextItem richTextItem;
richTextItem = report.createRichTextItem("Body");
view = nab.getView("People");
personDocument = view.getFirstDocument();
while (personDocument != null)
{
Database mailDatabase;
try {
mailDatabase = session.getDatabase (
personDocument.getItemValueString("MailServer"),
personDocument.getItemValue String ("MailFile"));
temp = "Mail Owner: " + personDocument.getItemValueString("FullName")
+ " Size: " + mailDatabase.getSize()
+ " _ bytes Template: " + mailDatabase.getDesignTemplateName();
mailDatabase.recycle();
} catch (Exception e) {
temp = "Could not open mail file for: " +
personDocument.getItemValueString("FullName") + " Server: " +
personDocument.getItemValueString("MailServer") + " , " +
personDocument.getItemValueString("MailFile");
}
richTextItem.appendText(temp);
richTextItem.addNewLine(1);
temp = "";
tempDocument = view.getNextDocument(personDocument);
personDocument.recycle();
personDocument = tempDocument;
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

通過發送電子郵件(清單 14 的第 28 行),然后回收我們創建的其余 Domino 對象(請參見清單 18)包裝此示例。


清單 18. 發送電子郵件並回收 Domino 對象

import lotus.domino. *;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)

Database nab;
nab = session.getDatabase("Enter_Server_Name_Here","names.nsf");
Database reportDatabase;
Document personDocument;
Document report;
Document tempDocument;
View view;
String temp;
reportDatabase = agentContext.getCurrentDatabase();
report = reportDatabase.createDocument();
report.replaceItemValue("Form" , "Memo");
report.replaceItemValue("Subject" , "Mail Applications Report");
RichTextItem richTextItem;
richTextItem = report.createRichTextItem("Body");
view = nab.getView("People");
personDocument = view.getFirstDocument();
while (personDocument != null)
{
Database mailDatabase;
try {
mailDatabase = session.getDatabase (
personDocument.getItemValueString("MailServer"),
personDocument.getItemValue String ("MailFile"));
temp = "Mail Owner: " + personDocument.getItemValueString("FullName")
+ " Size: " + mailDatabase.getSize()
+ " _ bytes Template: " + mailDatabase.getDesignTemplateName();
mailDatabase.recycle();
} catch (Exception e) {
temp = "Could not open mail file for: " +
personDocument.getItemValueString("FullName") + " Server: " +
personDocument.getItemValueString("MailServer") + " , " +
personDocument.getItemValueString("MailFile");
}
richTextItem.appendText(temp);
richTextItem.addNewLine(1);
temp = "";
tempDocument = view.getNextDocument(personDocument);
personDocument.recycle();
personDocument = tempDocument;
}
report.send(false, "Enter_Email_Address_Here");
if (session !=null)
session.recycle();
if (agentContext !=null)
agentContext.recycle();
if (nab != null)
nab.recycle();
if (reportDatabase !=null)
reportDatabase.recycle();
if (personDocument !=null)
personDocument.recycle();
if (report !=null)
report.recycle();
if (view !=null)
view.recycle();
if (richTextItem !=null)
richTextItem.recycle();
} catch(Exception e) {
e.printStackTrace();
}
}
}

表 8 匯總了兩種語言的比較。


表 8. 示例 3 兩種語言之間的比較
LotusScript Java

示例 3:用郵件數據庫信息生成報告

 Dim session As New Notessession 

Dim nab As New Notesdatabase(
"Enter_Server_Name_Here",
"names.nsf")

Dim reportDatabase As Notesdatabase

Dim personDocument As NotesDocument
Dim report As NotesDocument

Dim view As NotesView
Dim temp As String

Set reportDatabase = session.CurrentDatabase
Set report = reportDatabase.CreateDocument

Call report.ReplaceItemValue("Form" , "Memo")
Call report.ReplaceItemValue("Subject" ,
"MailApplications Report")

Dim richTextItem As New NotesRichTextItem(report,
"Body")

Set view = nab.GetView("People")
Set personDocument = view.GetFirstDocument
While Not personDocument Is Nothing
On Error Resume Next
Dim mailDatabase As New NotesDatabase(
personDocument.mailserver(0),
personDocument.mailfile(0))
If mailDatabase.IsOpen Then
temp = "Mail Owner: " &
personDocument.fullname(0) &
"Size: " & Cstr(mailDatabase.size) &
" _ bytes Template: " +
mailDatabase.DesignTemplateName
Else
temp = "Could not open mail file for: " &
personDocument.fullname(0) &
"Server: " &
personDocument.mailserver(0) &
" , " & personDocument.mailfile(0)
End If

richTextItem.AppendText(temp)
richTextItem.AddNewline(1)
temp = ""
Set personDocument=view.GetNextDocument(
personDocument)
Wend
Call report.Send(False,"Enter_Email_Address_Here")

示例 3:用郵件數據庫信息生成報告

 Session session = getSession(); 
AgentContext agentContext =session.getAgentContext();

Database nab;
nab = session.getDatabase("Enter_Server_Name_Here",
"names.nsf");
Database reportDatabase;

Document personDocument;
Document report;
Document tempDocument;
View view;
String temp;

reportDatabase =agentContext.getCurrentDatabase();
report = reportDatabase.createDocument();

report.replaceItemValue("Form" , "Memo");
report.replaceItemValue("Subject" ,
"MailApplications Report");

RichTextItem richTextItem;
richTextItem = report.createRichTextItem("Body");

view = nab.getView("People");
personDocument = view.getFirstDocument();
while (personDocument != null)
{
Database mailDatabase;
try {
mailDatabase = session.getDatabase(
personDocument.getItemValueString("MailServer"),
personDocument.getItemValueString("MailFile"));

temp = "Mail Owner: " +
personDocument.getItemValueString("FullName") +
"Size: " + mailDatabase.getSize() +
" _bytes Template: " +
mailDatabase.getDesignTemplateName();
mailDatabase.recycle();
} catch (Exception e) {
temp = "Could not open mail file for: " +
personDocument.getItemValueString("FullName") + "
Server: " +
personDocument.getItemValueString("MailServer") +
" , " +
personDocument.getItemValueString("MailFile");
}

richTextItem.appendText(temp);
richTextItem.addNewLine(1);
temp = "";
tempDocument = view.getNextDocument(personDocument);
personDocument.recycle();
personDocument = tempDocument;
}
report.send(false,"Enter_Email_Address_Here");

if (session !=null)
session.recycle();
if (agentContext !=null)
agentContext.recycle();
if (nab != null)
nab.recycle();
if (reportDatabase !=null)
reportDatabase.recycle();
if (personDocument !=null)
personDocument.recycle();
if (report !=null)
report.recycle();
if (view !=null)
view.recycle();
if (richTextItem !=null)
richTextItem.recycle();


其他要素

我們進一步介紹一些與我們討論的 Java 代碼和 LotusScript 相關的其他要素。

JVM 版本。與 LotusScript 不同,Java 代碼運行在 Java 虛擬機 (JVM) 上。表 9 顯示了與各個 Notes/Domino 版本一起提供的 JVM 版本。

表 9. JVM 和 Notes/Domino 版本

Notes/Domino 版本 JVM 版本
6.5.x 1.3.1
7.0.x 1.4.2
8.0.x 1.5.0
8.5 1.6.0

JVM 在普通客戶機 / 服務器安裝期間安裝並且與安裝在操作系統上的 JVM 無關。使用 JVM 提供的類時版本很重要,因為不同版本之間有一些不同之處。

recycle() 方法。如果在 Designer 幫助文件中瀏覽 Domino 類,會注意到每個 Java 類都有一個額外的方法,名為 recycle 方法(LotusScript 中沒有相應方法)。此方法說明(選自幫助文件)解釋道 “recycle 方法無條件地銷毀對象並將其內存歸還給系統”。

我們不打算深入解釋為什么應該調用 recycle 方法,因為此主題在 Lotus Support Technote #1097861, “Why it is important to use Recycle() method on every Java object” 中進行了詳細介紹。只要記住,要防止內存泄露,應該總是對創建的所有 Domino Java 對象調用 recycle 方法。

安全異常。因為 Java 代碼運行在 JVM 上,Java 代碼有一個額外的安全層,在使用 LotusScript 時沒有提供。取決於使用的 Java 類 / 方法,在 Lotus Domino 中運行 Java 代碼時可能會遇到安全異常,比如 java.security.AccessControlException 異常。

如果確實遇到了安全異常,必須在 JVM 的 java.policy 文件中明確授予訪問權限。有關更多信息,請參見 Lotus Support Technote #1279509, “Security exceptions are encountered when developing Java agents”。

將外部 JAR 文件與 Java 代理一起使用。類似於 LotusScript .lss 文件,Java 代理可以使用現有 Java 類。如果 JAR 文件帶有要使用的 Java 類,可以通過使用以下三種方法之一,使這些類對於代理可用:

  • 將 JAR 文件附加到代理本身:
  1. 在 Domino Designer 中打開 Java 代理並單擊 “Edit Project”。
  2. 在 Base 目錄字段選擇 JAR 文件所在的目錄。
  3. 選擇並添加 JAR 文件。
  • 將 JAR 文件復制到 {Lotus Notes\Domino program directory}\jvm\lib\ext。
  • 使用 JavaUserClasses Notes.ini 變量;在 Notes 或 Domino Notes.ini 文件中,添加該變量並指向一個或多個 JAR 文件,例如:

JavaUserClasses=C :\jar_files\file1 .jar;C:\jar_files\file2.jar

注:使 JAR 文件可用后,必須在代理中使用 import語句引用要使用的特定類。


結束語

希望本文能幫助傳統 Domino 開發人員輕松開始其在 Domino Designer 中開發 Java 代理之旅。上述示例可以作為模板代碼,用於開發更廣泛的 Java 代理。記住 Domino Designer 8.5 幫助文件為每個 Domino 類提供了大量 Java 示例。


參考資料

學習

獲得產品和技術

討論

關於作者

Oscar I Hernandez 是 IBM Lotus 技術支持中心的高級軟件工程師。他是 Lotus Notes/Domino 應用程序開發團隊的成員,也是 IBM 認證的高級應用程序開發人員。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: