對於 IBM Lotus Notes 應用程序開發人員來說,LotusScript 和 LotusScript 類在設計 Notes 應用程序時很有用。LotusScript API 支持以編程方式與數據庫、文檔,甚至設計元素進行交互。隨着 Java 發展成爲主流編程語言,原來越多的 Notes 應用程序開發人員開始將目光投向 Java。
本文面向那些想要在 IBM Lotus Domino 中使用 Java 進行編程的 LotusScript 開發人員。假定讀者具有一定的 LotusScript 編程經驗。
本文包含三部分: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” 示例的需要。
模板 Java 代理代碼 | Hello World Java 代理代碼 | ||
|
|
我們來逐行看一下這段代碼:
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 提供了 8 種基本類型:byte、short、int、long、char、float、double 和 Boolean。 表 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 教程運算符頁面。
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)。
return _type function_name(parameter_type 1 parameter_name 1, parameter_type2 parameter_name2) { // 函數代碼 ... return return_type_object; } |
Java | LotusScript | ||
|
|
||
Calling the function:
|
Calling the function:
|
創建類
Java 中創建類的語法與 LotusScript 中的類似。它們都使用帶有 private/public 選項的類關鍵字,並且都支持類成員以及類方法。但是,需要注意 LotusScript 類構造方法使用 New 關鍵字,而 Java 使用無參數的類名稱(請參見清單 2 和表 4)。
class class_name { type class_member1; type class_member2; .... class _name() // 構造方法 { // 構造方法代碼 } return _type class_method1 (parameter list) { // 方法代碼 } return _type class_method2(parameter list) { // 方法代碼 } .... } |
Java | LotusScript | ||
|
|
||
創建類的實例 :
|
創建類的實例 :
|
流控制語句
要控制腳本流動,Java 提供了您希望從編程語言中獲得的所有標準流控制語句。表 5 列出了 Java 最常用的流控制語句及其 LotusScript 等價物。有關 Java 流控制語句的更多信息,請訪問 Java 教程控制流語句頁。
Java 流控制語句 | LotusScript 等價物 | ||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
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 中進行對等操作。第一個例子是發送電子郵件消息。
花一分鐘時間來研究一下下面清單 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)。
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)。
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 關鍵字來設置變量。
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 區分大小寫)。
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() 方法”一段。
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 彙總了兩種語言的比較。
LotusScript | Java | ||
示例 1:發送電子郵件
|
示例 1:發送電子郵件
|
第二個示例中,我們將循環通過 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 變量)。
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 彙總了兩種語言的比較。
LotusScript | Java | ||
示例 2:循環通過 Notes 視圖
|
示例 2:循環通過 Notes 視圖
|
最後一個示例使用廣泛。這裏我們循環通過 Domino 服務器上的郵件數據庫並用來自每個郵件文件的各個項創建一個電子郵件報告。首先,花些時間看一下清單 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)。
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)。
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。
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)包裝此示例。
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 彙總了兩種語言的比較。
LotusScript | Java | ||
示例 3:用郵件數據庫信息生成報告
|
示例 3:用郵件數據庫信息生成報告
|
我們進一步介紹一些與我們討論的 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 文件附加到代理本身:
- 在 Domino Designer 中打開 Java 代理並單擊 “Edit Project”。
- 在 Base 目錄字段選擇 JAR 文件所在的目錄。
- 選擇並添加 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 示例。
學習
- 參閱:Java 教程。
- 參閱 Lotus Domino Designer 8.5 信息中心:Java/CORBA 類部分。
- 學習 developerWorks 文章: 通過 Java/CORBA 訪問 Domino。
- 學習 developerWorks 文章: Java 對 Domino Objects 的訪問,第 1 部分。
- 學習 developerWorks 文章: Java 對 Domino Objects 的訪問,第 2 部分。
- 學習 developerWorks 文章: Domino 的業務域驅動 Java 類的層次結構。
- 參閱:developerWorks Lotus Notes 和 Domino 產品頁面。
獲得產品和技術
- 下載試用版:Lotus Domino Designer V8.5.1。
- 下載試用版:Lotus Domino 和 Lotus iNotes。
- 下載試用版:IBM Lotus Notes 和 Domino Administrator 8.5 客戶端軟件。
討論
Oscar I Hernandez 是 IBM Lotus 技術支持中心的高級軟件工程師。他是 Lotus Notes/Domino 應用程序開發團隊的成員,也是 IBM 認證的高級應用程序開發人員。
原文鏈接:http://www.ibm.com/developerworks/cn/lotus/d-ls-javaapps/#ibm-pcon
爲本文評分