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

genusBIT發表於2010-06-26

轉自http://www.ibm.com/developerworks/cn/lotus/d-ls-javaapps/

簡介

對於 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 示例。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-666342/,如需轉載,請註明出處,否則將追究法律責任。

相關文章