在 IBM Lotus Domino Designer 中使用 Java 構建應用程式
轉自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 語言部分開始閱讀。
|
釋出於 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.*;
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. 的等價物(如果有)。
表 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 | ||
|
| ||
Calling the function:
|
Calling the function:
|
建立類
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 | ||
|
| ||
建立類的例項 :
|
建立類的例項 :
|
流控制語句
要控制指令碼流動,Java 提供了您希望從程式語言中獲得的所有標準流控制語句。表 5 列出了 Java 最常用的流控制語句及其 LotusScript. 等價物。有關 Java 流控制語句的更多資訊,請訪問 Java 教程控制流語句頁。
表 5. 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. 程式碼:
清單 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:傳送電子郵件
|
示例 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 變數)。
清單 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 檢視
|
示例 2:迴圈通過 Notes 檢視
|
最後一個示例使用廣泛。這裡我們迴圈通過 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:用郵件資料庫資訊生成報告
|
示例 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 示例。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-666342/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 IBM Bluemix 構建,部署和管理自定義應用程式IBM
- 在 Laravel 應用中構建 GraphQL APILaravelAPI
- 使用Java和Spring MVC構建Web應用JavaSpringMVCWeb
- 使用Java和Reactive Streams構建流式應用JavaReact
- 使用shell指令碼在Linux中管理Java應用程式指令碼LinuxJava
- 使用 Micronaut和OpenFaaS 構建無伺服器Java 應用程式 - openvalue伺服器Java
- 使用Rust和WebAssembly構建Web應用程式RustWeb
- 使用微服務構建現代應用程式微服務
- 使用 webpack 構建應用Web
- 使用SvelteKit構建實時websocket應用程式 - IngestWeb
- 使用 Lambda Web Adapter 在 Lambda 上 構建 web 應用WebAPT
- 使用Java和Dapr構建雲原生應用簡介Java
- 使用汽車應用庫構建應用
- Java應用構建並部署ECSJava
- 在gradle中構建java專案GradleJava
- 使用 nuxi build 命令構建你的 Nuxt 應用程式UXUI
- Judo:使用無程式碼構建原生應用體驗
- 在 Android 12 中構建更現代的應用 WidgetAndroid
- 五、Spring Web應用程式構建SpringWeb
- JavaFX桌面應用-構建程式框架Java框架
- 使用webpack構建多頁應用Web
- 使用 Kotlin 構建 MVVM 應用程式—提高篇:Dagger-AndroidKotlinMVVMAndroid
- 使用JHipster構建Spring和React構建電子商務應用程式原始碼 -DEVSpringReact原始碼dev
- MVC模式在Java Web應用程式中的實現MVC模式JavaWeb
- 使用 Docker 和 Elasticsearch 構建一個全文搜尋應用程式DockerElasticsearch
- 如何使用JavaScript UI控制元件(WijmoJS)構建Electron應用程式JavaScriptUI控制元件JS
- 我們是如何使用 Electron 構建 Linux 桌面應用程式的Linux
- 「譯」使用 Node 構建命令列應用命令列
- 使用Spring ViewComponent + htmx構建SpringBoot應用ViewSpring Boot
- 使用 Cloudflare 構建 Web3 應用CloudWeb
- 使用Java和Neo4j構建圖資料庫應用Java資料庫
- Spring Boot 中 10 行程式碼構建 RESTful 風格應用Spring Boot行程REST
- [Flutter翻譯]我希望在構建Flutter應用程式之前知道的事情Flutter
- 如何基於 Redis 構建應用程式元件Redis元件
- 堆在java中的應用--PriorityQueueJava
- 使用 Redis 和 Python 構建一個共享單車的應用程式RedisPython
- 構建 API 應用API
- 用Java構建反應式REST API - Kalpa SenanayakeJavaRESTAPINaN
- 使用Angular與TypeScript構建Electron應用(六)AngularTypeScript