domino介紹

1.前言

  DOMINO是一個以電子郵件爲基礎發展起來的標準羣件平臺,從1982年開始發佈第一個版本,至今已經有數十年的歷史,正式註冊用戶過億。

  它最大的優點就是提供了大量內置的如SMTPPOPLDAPHTTPHTTPS等集成的系統服務,所以使用戶快速構建跨平臺的解決方案成爲可能。

  整個平臺由DOMINOSERVERDOMINO服務器)、ADMINISTRATORDOMINO管理工具)、DESIGNERDOMINO開發設計工具)、NOTESDOMINO客戶端)組成,在一些針對性應用方面還有LOTUS-WORKFLOWDOMINO工作流設計系統)、LOTUS-DOMINO.DOCDOMINO文檔管理系統)、LOTUS-QUICKPLACEDOMINO協作平臺)、LOTUS-LEIDOMINO數據交互系統)、LOTUS-LEARNINGSPACEDOMINO培訓系統)等強有力支持。

2.開發工具分析 

2.1 幀結構集

  幀結構類似於HTML開發中的框架設計,幀結構集是幀結構的集合。幀結構是較大幀結構集的一個區段或窗格,並且可以獨立滾動。通過使用幀結構集,設計者可以在幀結構之間創建鏈接使彼此相互關聯。幀結構集可以在用戶轉向或鏈接到其他頁面或數據庫是仍然保持某個頁面的顯示狀態。幀結構一般不採用3-D邊框,邊框寬度設爲0。 

2.2 頁面

  頁面是用來顯示信息的設計元素。與收集信息的表單不同,頁面主要用來向用戶展示信息,因此用戶不能在頁面上創建任何字段或者子表單,但可以創建HTML控件。因此頁面可以用所見即所得的HTML製作工具來進行開發設計。

   頁面適用於靜態信息或者作爲其他元素的容器。可以使用頁面作爲用戶應用的開始界面或者作爲提交文件後的提示界面。

2.3 主表單

  表單是用於在數據庫中輸入和查看信息的載體。

  表單可以包含

  1)存儲數據的字段   2)標註字段或者提供指示的文本  

  3) 存儲用戶想要在多個表單上使用的表單元素集合的子表單 

4) 可以結合圖形和字段的佈局區域 它們所採用的方法可以提供更大的設計靈活性

  5)可以使表單更容易理解的圖形   6) 彙總或者組織信息的表格 

  7)對象 OLE 預定 Notes/FX(TM)字段 文件附件 URL 以及可以擴展Notes

  文檔範圍的鏈接

  8)可以自動執行函數的動作按鈕

  9)可以強化文檔外觀的背景顏色和圖形

  10)在表單中包含其他設計元素的嵌入式元素

  在應用上細分DOMINO系統中表單一般分爲主表單和子表單,而主表單又分爲數據存放表單和數據展現表單。

  其中數據存放表單一般的設計處理方式是數據字段設計在該主表單中,公共控制信息(如流轉控制)設計成子表單(component)。再將該子表單加入到主表單中。確保整體設計結構清晰,在內容上主要包含的內容有:數據信息、按鈕操作、用戶界面、功能子表單等。

  而數據顯示錶單的設計處理方式是用於在瀏覽器中進行數據瀏覽的表單,爲了保證界面的友好性,一般採用CSS定義整體風格。 

2.4 視圖

  視圖是訪問數據庫中文檔的入口,每一個數據庫至少必須包含一個視圖,基於所選擇的準則,視圖可以顯示數據庫的文檔子集或者所有的文檔。基於文檔的內容,也可以對文檔進行分組和排序。

  在創建視圖的之前一定要:

視圖有一箇中文名稱和一個英文別名,在代碼中始終引用英文別名

視圖的列樣式、列頭字體、顏色、大小在同一個數據庫內應該統一

視圖標題欄高度,行間距應該統一設定好,一般設定爲11 1/4

如果視圖需要分類摺疊顯示,要出現可摺疊標記

視圖上的操作應該出現在操作欄的左側

視圖應該行數應該使用交替顏色顯示

視圖列的最後一列應該擴展到窗口寬度

用戶不直接查看的視圖應定義爲隱藏視圖

如果視圖要嵌入到頁面,用於Web訪問,則應該選定“在瀏覽器中使用小程序”

2.5 文件夾

  文件夾是用來存儲文檔的容器。文件夾與視圖具有相同的外觀,而且其設計方法也與視圖大致相同。其區別僅在於應用的時候視圖具有可以自動選擇並顯示文檔的文檔選擇公式,而文件夾則不是,它是通過用戶手動的添加來顯示文檔的。所以在設計的時候,其設計知道方法可以大致跟視圖相類似。   

2.6 共享代碼 

2.6.1 代理

  代理Agent可以讓用戶在Domino中自動執行許多任務。它們是可以在數據庫中爲用戶執行特定任務的獨立程序。例如可以歸檔文檔、改變字段值、發送郵件消息、刪除文檔或者執行與外部應用進行交互這樣的功能更爲強大的動作 。

  代理還能夠進行設置在服務器上基於安排或者在出現特定事件時自行運行。

2.6.2 WEB服務

Web服務和Domino 

  Domino 6是一個理想的應用程序,用於宿主或使用Web服務。由於Web服務主要是由XML數據組成。因爲DOMINO目前有更多被設計用來特殊處理XMLLotusScript類,因此DOMINOWEB服務有天生的好支持。

  也有一些有用的工具可提供對DominoWeb服務的附加的支持,它們是:

  對LotusScript的 SOAPConnect-這個工具包含了一個LotusScript庫它允許您使用和宿主Web服務。

  MS SOAP工具包-Microsoft 提供的允許DominoWindows平臺上使用或

宿主Web服務

    .NET-來自Microsoft 的一個工具集讓您使用和宿主Web服務這個工具集可

Lotus Notes/Domino經由Common Object Model (COM)接口訪問。

    以下的段落接着描述WEB服務的本質。Web服務可以被定義爲一個應用程序它提供了一個API,以便將自己與其他應用程序集成在一起。Web服務的主要功能是提供過程到過程的交互作用而不需要用戶界面,也就是說您可以通過與API接口遠程調用這個應用程序,調用這個服務的應用程序被稱爲客戶機程序。

  XML位於Web服務的核心併爲描述遠程過程調用Remote Procedure Call Web服務以及Web服務目錄提供了一種公共的語言。

  Web服務這個短語有時可能會容易誤解好像它意味着使用Web瀏覽器,然而並不總是這種情況,有許多不同的調用Web服務的方法例如一個HTTP請求或者來自另一個應用程序的一個電子郵件是其中的一些方法。

   調用一個Web服務的最常用的方法之一是通過發送一個HTTP Get 請求到API。經由Internet 訪問API有許多優點,API可以被任何具有Web服務地址的全球客戶機訪問,Web 服務應用程序裏的一個修改只需要在數據源完成,Web 服務可以以任何語言和在任何平臺上書寫,只要那些Web服務根據Web服務標準可訪問, 

爲了使協同性有效,Web服務平臺必須提供一個標準系統,該系統將與使用不同的平臺和/或編程語言的系統有接口。

  一個Web 服務平臺需要描述此Web服務並提供其他應用程序爲了調用這個Web服務所需要的信息。構成Web服務平臺的主要技術如下:

  XML-這是用於在Web服務平臺上表示數據的基本格式;

  SOAP-簡單對象訪問協議 (Simple Object Access Protocol) Web服務的遠程過程調用(RPC)工具SOAP是一個傳輸協議,它使用HTTP POST請求來傳輸。方法所返回的響應是一個XML文檔。

  WDSL Web服務描述語言Web Service Description Language-是一個基於XML的文法,它用於描述Web服務及其函數參數和返回值。

  UDDI-通用描述發現和集成(Universal Description, Discovery, and Integration)

  一個基於XML的目錄它表示一種技術規範用於發佈和發現業務和Web服務。

2.6.3 大綱

  每個數據庫都需要一種方法進行導航。可以利用大綱設計起來創建大綱,給用戶提供一個自動鏈接,具有個人風格的站點導航圖。大綱可以包含背景圖形、定製圖標、鏈接或者操作。

  所以在設計大綱的時候,對大綱採用的大綱項圖標,以及大綱項所採用的字體,字號,顏色,mouseover的顏色等都要事先定製,顏色,圖標採用不一定要相同,但是應該在保證風格統一,並且與整體界面沒有衝突的前提下,體現出各自的特點。大綱項與大綱都應該採用別名的形式,在程序調用中調用英文別名

2.6.4 子表單

   子表單 subform是用戶可以在多個表單中使用的表單片段。例如用戶可以在子表單中建立公司的信頭,然後在各種商業表單中使用這個子表單。

   子表單能夠包含與常規表單相同的元素, 可以基於公式在表單上加載子表單。

2.6.5 共享域

    共享域類似於字段,但是可以在不同的表單中使用,如果用戶改變共享域的屬性,那麼這些改變就會應用於所有出現這個字段的場合,他的主要作用是域進行一次定義而後重複使用。便於設計改動時的工作。  

2.6.6 自動化組件

  嚮應用程序中添加自動功能可以加速執行重複任務、路有文檔、更新信息、執行計算、運行程序以及檢查錯誤的自動化組件:

操作按鈕

  通過點擊它們,可以使某些任務得以自動完成。特別是對於Web瀏覽器用戶,需要使用操作來模擬Notes菜單項。

熱點

  熱點是用戶單擊後可執行操作、運行公式或Script以及轉向鏈接的文本或圖片。熱點是可以到另一個Web站點、數據庫或數據庫元素的鏈接,還可以是按鈕、彈出式文本或公式以及操作。

2.6.7 共享操作

  共享操作是在表單或視圖中設置用戶激活的任務。共享操作的設計位置雖然與操作不同,但是設計方法兩者沒有什麼區別,對操作設計的一些規定,在此同樣適用。

2.6.8 SCRIPT

   腳本庫是集中存放共享代碼的位置具體可包含LotusScriptJavaScript以及Java庫。

2.6.9 導航器

  導航器是用戶能夠包含可以用於導航的可編程區域和熱點的圖形。熱點通常可以指示用戶前往數據庫或者Web站點的另外部分。但是總的來講,導航器是NOTES 4.X版本的產物,是一項過時的技術,所以在開發的時候不再建議開發人員使用導航器,而去使用頁面嵌入大綱來對應用進行導航。

2.6.10 

  層layer這種設計元素不能在數據庫級別建立,而是要在頁面表單或者子表單中建立。層可以讓用戶在頁面表單或者子表單上放置重疊的內容塊,因爲用戶能夠控制信息的位置大小和內容。所以層能夠讓用戶進行靈活的設計,用戶能夠建立和堆砌多個層使其彼此交錯。透明層可以展現其下的層不透明的層可以隱藏其下的層。 層的內容要依賴於用戶要在頁面還是表單上建立層,當用戶在頁面上建立層的時候層就可以包含與頁面包含內容相同的元素,例如用戶能夠增加文本和圖形等內容;當用戶在表單上建立層的時候層就能夠包含與表單包含內容相同的元素例如用戶能夠增加文本和圖形 以及受控的訪問部分 字段和子表單 

2.6.11  DXL  

   Domino數據的XMLExtensible Markup Zarauage可擴展標記語言表示稱爲DXL

DXL可以描述特定於Domino的數據以及嵌入式視圖表單和文檔這樣的設計元素。隨着XML成爲交換信息的標準基礎,DXL也爲將數據的XML表示導入和導出到

Domino應用提供了基礎。利用DXL實用工具用戶就能夠查看和導出用戶的Domino設計元素,用戶還可以使用轉換器Transformer實用工具和XSL樣式表單文件將其轉換爲另外的格式,XSL文件包含了針對XML數據的格式  

3. 開發要點編碼語言以及代碼優化分析

3編碼語言的選擇

在具體的開發過程中,根據需求性質,DOMINO可以有多種編碼語言的選擇。

主要有公式、lotusscriptjavajavascript語言,比較起來,特別簡單的功能和邏輯,用公式實現比較快;複雜的功能和邏輯,用lotusscript比較快。

java語言可以實現多線程,完全面向對象,處理大量文檔時,如果程序利用

到多線程,比不能利用多線程的lotusscript快。

另外針對於底層開發,LOTUS還有專門的Toolkits支持:

  按Lotus產品系列來分,Lotus提供下列產品的工具包: Notes/Domino Sametime QuickPlace Discovery Server Other

  其中,Notes/DominoSametime的工具包比較多,CC++Java語言的都有,其他產品的則很少。從這個角度,也可以看出文檔數據處理、協同工作是Lotus系列產品的核心價值所在。其中,Notes/Domino的工具包有: 

Lotus C API toolkit Lotus            C++ API toolkit 

Lotus Domino Toolkit for Java/CORBA  Lotus and Notes Toolkit for COM 

Lotus Domino Driver for JDBC (簡稱LDDJ)  NotesSQL 

Lotus XML Toolkit(簡稱DXL) Custom Tag Converion kit(簡稱DCT) 

LotusScript Extensions toolkit(簡稱LSX) 

   在Domino/NotesToolkit中,C API的功能最爲強大:可以操縱notes數據庫中幾乎所有的數據對象:數據庫及ACL、文檔和域、表單、視圖和文件夾、代理、可以爲Notes客戶端的增加附加菜單、可以用來創建附加的Domino服務任務、可以用來擴展Domino/Notes的事件管理。

而其主要限制如下:

  不能修改已有的Domino/Notes軟件,不能去除其已有的功能、特性,或者改變其工作機理、不能修改安全特性、不能修改用戶活動記錄 

    支持的操作系統: WindowsNT/2000, Linux, Solaris SPARC/Intel, HP-UX, MacOS, AIX, AS/400, S/390等。

3編碼優化原則

1)公式語言優化

1.使用@ClientType代替@UserRoles來檢查客戶端類型

   從R4.6開始,不必使用@UserRoles中的$$WebClient來檢查客戶端是否使用瀏覽器,直接使用@ClientType比較快

2.使用簡單的公式隱藏條件比較快

  以下三種寫隱藏的選擇,性能遞減。可以利用第一個,不要寫判斷@ClientType的公式;可以利用編輯模式,不要寫判斷@isdocbeingedited的公式

   a.根據客戶端程序類型   b.根據編輯模式   c.根據公式隱藏

3.@dblookup@dbcolumn公式中使用列號比使用域名快

  使用域名需要在域列表中對比,但直接使用列號會帶來維護的困難。

4.打開@dblookup@dbcolumncache開關

  cache不但可以使這個公式執行更加快,而且可以使‘同一個數據庫’中,‘同樣公式’的另一個lookup運行更快。cache是基於數據庫的,不同數據庫的相同lookup不能利用相同的cache。注意:無論是否打開cachelotusscript調用evaluatelookup都不能利用cache

5.根據4,如果公式和lotusscript都要利用相同的lookup結果,可以將信息放到profile文檔中。

6.lookup一個包含很多文檔的視圖時,創建一個隱藏視圖,僅包含必要的列。視圖越小,越快。

7.如果要取視圖中的幾個列,分別取的話,每個lookup都要花時間。將幾個列組合成一個列,用特別的字符分隔,一次取出來,然後分析出幾個域。

8.一段公式中,數次利用同一個結果集,用臨時變量保存,而不是每次重新取

9.使用不同的搜索方法,如果處理的文檔集較小(例如少於數據庫中所有文檔的15%),使用lotusscript比公式快,如使用getview , search, ftsearch等方法。

10.使用‘顯示時計算’域來避免不必要的重複計算。下表是使用各種類型域時,不同事件引發的計算情況:

Field    Create    Open      Open         Show      Save     Refresh

Type               (empty)   (data)      Dialog

Edit     DV                                          IT,IV   IT IV

(normal)

Edit     DV                   KF           KF        IT,IV   IT IV

(K-UF-DB)

Edit     KF,DV      KF        KF                     IT,IV   IT IV

(K-UF-Not DB)

Computed  V                                          V       V

Computed for 

display   V          V         V                     V       V

Computed for

composed  V

上面縮寫的解釋

normal----Normal edit field (not one of the two special ones that follow)

K-UF-DB---Keyword, Use formula for choices, dialog box

K-UF-Not DB---Keyword, Use formula for choices, check boxes or radio buttons

DV   -----Default value formula executes

IT   -----Input translation formula executes

IV   -----Input validation formula executes

KF   -----Keyword formula executes

V    -----Value formula executes

Create----Field is being created (either because the document is being created

or an existing document is opened that does not contain the field)

Open -----Opening an existing document — in either Read or Edit mode

Empty---Field is empty (exists in document but has no contents)

data-----Field has data

Show Dialog---User presses the icon to display the dialog box

注意兩點:

1.使用check boxradio box,一打開文檔,公式總要計算,即使僅僅打算閱讀而不是修改文檔,看起來是合理的,因爲需要計算出各個項目供閱讀嘛

2.已經有數據的,使用對話框格式的編輯域,打開時候也要重新計算,這個就不太合理了。

   當使用複雜的@dblookup時,性能有很大影響。隱藏公式域沒有作用,因爲仍然會發生計算。按照下面方法解決

1)創建一個隱藏的多值‘顯示時計算’域:kwDataHidden,計算公式是原來的@dblookup公式,但仍然要做如下處理,值公式寫成這樣:

   rem "Do not run formula during doc save";

   @if (@IsDocBeingSaved; @Return("");"");

   rem "Only run if doc is in edit mode";

   @if (@IsDocBeingEdited;@DBColumn(............);"")

2)在表單的PostModeChange中,寫:@If(@IsDocBeingEdited;@Command([ViewRefreshFields]);""),(實際上,如果覺得公式的值的修改頻率不是太快的話,這裏也可以不寫)

3)真正操作那個域的公式寫:kwDataHidden;並且該域屬性選擇‘刷新文檔時刷新選項’。

2)腳本語言優化

1.使用For loop,不使用Do loop 或者 while loop的循環

  前者比後者快60%(不計算循環內部時間的情況下)

2.引用數組元素的時候,使用Forallfor

  一維數組,前者快75%,二維以上,也可以快50%

3.簡化if語句

  lotusscript不會象c那樣進行邏輯語句優化,所以

    If a=x and b=y then 

    應該寫成

    If a=x then

       if b=y then

    後者快40%

4.避免混合變量類型(計算)(也就是不要隱式造型)

    dim a as single

    dim z as long

    z = 3

    a = 1.0

    z = z+a

    上面這一段使用了implied castingz=z+(long)a會比較快

1.對整數結果,使用整數除法:z& = x& \ y& 比 z& = x& / y& 60%

2.僅在有必要的時候才使用variant類型,lotus使用更多的時間處理variant

3.讀取文件的時候,一次讀取一塊,而不是一行,下面的例子AB快接近5倍!而且讀取的文件越大,越明顯。

    example A

Open fName$ for input as #fNum

buff$ = Input$(Lof(fNum),fNum)

stPos = 1

lineNo = 1

eoFile = false

While Not eoFile

  nlPos = Instr(stPos,buff$,Chr$(13))

  If (nlPos) > 0) then

    fData$(lineNo) = Mid$(buff$,stPos,nlPos - stPos)

    stPos = nlPos + 1

  else

    fData$(lineNo) = Mid$(buff$,stPos)

    eoFile = true

  end if

  lineNo = LineNo + 1

wend

close #fNum

    

    example B

Open fName$ for Input as #fNum

lineNo = 1

while Not Eof(fNum)

  Line Input #fNum , fData$(lineNo)

  lineNo = lineNo + 1

wend

close #fNum

注意,R4.6以及之前的版本,string變量有64k的限制,所以一上例子a需要再增加一些東西(不能一次讀取,而是要分次讀取文件),但塊讀取的好處仍然是顯而易見的。R5開始,string變量可以最大達到2G,足夠讀取非常大的文件了。例子A雖然增加了代碼量,但是可以大大加快速度,某些場合非常有用

5.避免無謂地使用數組,下面例子A比例子B快兩倍

Example A

For i = 1 to 100

  sum = sum + x(i)

Next

t(1)=sum

Example B

For i = 1 to 100

  t(1) = t(1) + x(i)

Next

Domino R5引入了新的數組處理函數:ArrayAppend , ArrayGetIndex , ArrayReplace , FullTrim,使用這些函數比自己寫相同的功能快

6.有一個不使用字符串數組的替代方法

  把所有數組中的字符串元素構造成一個字符串,用特殊分隔符分開(例如回車符),然後用  Instr  來取各個元素

7.優化字符串的處理

  字符串的處理非常消耗資源,例如下面這句很常見

X$= X$ & "a"

這個語句非常消耗資源(java中有類似現象,因爲涉及到重新生成字符串),下面這句縮短字符串也是很消耗資源的

x$ = Right$(x$ , currentLength% - lengthStrippeddOff%)

8.創建一個新的字符串有時候更加快

下面例子AB25%

A

str$ = stringA$ & stringB$

B

str$ = stringA$

str$ = str$ & stringB$

9.反覆處理字符串時,記住處理位置

  比不斷修改字符串長度快(其實是不斷生成新的字符串),下面例子AB85%

A

strPiece$ = Mid$(str$ , startPos% , pieceLength%)

startPos% = startPos% + pieceLength%

B

strPiece$ = Left$(str$ , pieceLength)

strLength% = strLength% - pieceLength%

str$ = Right$(str$ , strLength%)

10.謹慎是用redim命令

   可以理解,每次redim,是內存堆數據的乾坤大挪移,所以儘可能事先決定數組大小。實在沒有辦法,也千萬不要在循環中redim。以下例子AB20%

A

For i = 1 to 10000

  If ( i> iMax) then

     iMax = iMax + 100

     redim Preserve sArray(1 to iMax)

  end if

  sArray(i) = ""

Next

B

For i = 1 to 10000

  Redim Preserve sArray(1 to i)

  sArray(i)=""

Next

以上實際是減少redim的次數,每次增加多些,循環後可能還需要一次redim,讓數組空間和實際一致

11.在多維數組中循環

  應使用正確的順序。在外循環中操作後面的維數,在內循環中操作前面的維數(這個最奇怪了,估計跟數組的內存排放有關),下面的例子A比例子B400%!(實際測試,500PIII,看不出差別,都很快,當我再想增大數組元素個數的時候,宣稱已經超過32K限制了,faint!看來意義不大)

A

For y = 0 to 2

  for q = 0 to 5000

    z = z + x(q,y)

  Next

Next

B

For q = 0 to 5000

  For y = 0 to 2

    z = z + x(q,y)

  next

next

12.比較整數,而不是比較字符串

下面的例子A比例子B50%,例子C比例子D30%

A  If(Asc(x$) = Asc("A")) then 

B  If(Left$(X$,1) = "A") then

C  If(Asc(Mid$(x$ , 1, 1) = "A") then

D  If(Mid$(x,1,1) = "A") then

下面比較空串的例子E也比例子F30%

E  If (Len(x$) = 0) then

F  If (x$="") then

13.將數字轉爲字符串的時候使用自動造型,不用手工轉換

   例如 s2$ = "Text" & iNum s2$="Text & Cstr(iNum%) 稍微快一點,不過不明顯。

14.重要:避免過多使用環境變量

   環境變量要讀取notes.ini文件,對性能造成影響,替代辦法是使用profile。如果一定要使用環境變量,將多個環境變量合併成一個,用特殊符號分隔,取出來後再分析成多個。取10個單獨的環境變量要比取一個長的環境變量多花10倍時間!

3Java & JavaScriptino應用程序優化 

   Java需要裝入JVMclient端第一次運行的時候裝入,server端,隨着http裝入的時候裝入(所以不用http就不要裝入了,估計慢也是受到jvm影響   )有關java沒有什麼好說,就說兩點。

1.將需要的java類,儘可能放在類列表前面,儘可能接近base類,可以加快搜索速度

2.週期性調用回收函數,java本身是自動進行垃圾收集的,但是該書的意思似乎說java的垃圾回收,不能回收相關lotus objects用掉的內存 

3.Javascript,沒有什麼好說的,用於web頁面,域校驗,和輸入轉換,可以避免browserweb server來回交換數據,減少網絡流量

4DOMINO對象模型優化 

 利用後期初始化和對象重用技術來最大限度地利用資源

1.後期初始化(lazy initialization)。學習到一定地步的lotus程序員,爲了程序結果清晰,往往喜歡事先將一些對象如db , view , doc等初始化,然後每個函數都可以使用。從提高效率的角度,可以改進爲使用後期初始化(自己翻譯的,不知道是否準確,應用期初始化?),下面是後期初始化的方法

' *** Globals

' *** Declare the global data we share

Public gDb As NotesDatabase

Public gVwCustomerType As NotesView

'*** Functions

'*** Get the customer type view (lazy initialization)

'*** Do account validation

Sub Initialize

'*** Set up the database (NOT lazy)

Dim ss As New NotesSession

Set gDb = ss.CurrentDatabase

End Sub

Function GetCustomerTypeView() As NotesView

'*** Only get it the 1st time it is used

If (gVwCustomerType Is Nothing) Then

  Set gVwCustomerType = gDb.GetView("Customer Type")

End If

Set GetCustomerTypeView = gVwCustomerType

End Function

Function ValidateAccount(custName As String, _

accountType As String) As Integer

'*** Return True if account is valid

Dim vw As NotesView

Dim doc As NotesDocument

Dim aKeys(0 To 1) As String

Select Case AccountType

Case New

'*** New accounts are always valid

  ValidateAccount% = True

Case Else

'*** Is customer allowed the specified account type?

  Set vw = GetCustomerTypeView()

  aKeys(0) = custName$

  aKeys(1) = accountType$

  Set doc = vw.GetDocumentByKey(aKeys, True)

  If (doc Is Nothing) Then

   ValidateAccount% = False

  Else

   ValidateAccount% = True

  End If

End Select

End Function

以上GetCustomerTypeView函數中使用了lazy initialization方法,當該函數第一次被調用,它調用getview取得視圖,以後只要直接取publicvw即可,其他程序的結構不會受到影響(如果將全局變量的vw封裝在class中,則更加符合面向對象的規則)

5)最大限度重用對象

1.打開數據庫時的動作

   a.創建數據庫,涉及到內存分配和初始化

   b.定位數據庫,涉及到目錄查找,或者存取其他服務器

   c.初始化對象屬性,需要從數據庫讀取ACL等屬性

由於打開數據庫如此耗費資源,所以應該儘量重複利用打開的db,作爲參數傳遞,或者全局變量(或者類變量)而不是在每個函數中重新打開。

2.使用已有對象,比較下面,AB

A

dbTitle$ = doc.ParentDatabase.Title

B

set session = new NotesSession

set db = session.CurrentDatabase

dbTitle = db.Title

3.使用back-end類,比用front-end類快,並且back-end類可以添加任何數據類型和新域

4.使用NotesUIDocument類時,如果需要大量修改文檔域,禁止AutoReload屬性

修改前:source.AutoReload = false

修改後:source.AutoReload = true

        source.Reload

5.如果從視圖存取文檔,使用 ColumnValues訪問域,比直接訪問要快,但只有從視圖存取文檔才能利用這點,還有就是要注意columnNumber這個列數的計算,呵呵,很討厭的,不是視圖上的每個列都算在裏面

var = doc.ColumnValues(columnNumber%)

x   = var(0)

B

x =doc.fieldname

4。所有內置對象分析  

4內置變量

類型

命名規則(前綴)

說明

NotesSession

Session

NotesDataBase

Db

NotesView

View

NotesViewEntryCollection

Vec

NotesViewEntry

Entry

NotesViewColumn

Column

NotesACL

Acl

NotesACLEntry

Acle

NotesAgent

Agt 

NotesDateTime

Dt

NotesDbDirectory

Dir

NotesDocument

Doc,cdoc

Cdoc表示當前文檔

NotesDocumentCollection

Dcc

NotesEmbeddedObject

Embobj

NotesItem

Item

NotesRichTextItem

Rt

NotesForm

Frm

NotesRegistration

reg

string

str

integer

Ni

4內置表單

1. $$ViewTemplate for +視圖名稱.

?? $$Search$$NavigateTemplate for$defaultView$defaultForm$defaultNav$searchForm$file$icon$help$about 和 $first 

2. $$ViewTemplateDefault

?? NotesWEB編程中,使用命名爲『($$ViewTemplateDefault) | $$ViewTemplateDefault』的表單可以爲Notes數據庫提供一個缺省的WEB導航格式。

3.$$ReturnDocumentDeleted

定義WEB上文檔被刪除後的提示信息

4.$$ReturnAuthenticationFailure 

?? 用戶名稱和口令驗證失敗後的提示信息表單

5.$$ReturnAuthorizationFailure

?? 當用戶對數據庫的訪問權限不夠時提示信息.

6.$$ReturnGeneralError 

?? 一些其他的錯誤發生時提示信息.

7.$$SearchTemplateDefaultForm

數據庫在WEB上的缺省搜索表單名稱

另外針對視圖的查詢搜索增加如下內容:可以定製針對某個視圖的查詢顯示錶單,如:DBName:=@Subset(@DbName;-1);

"[[/"+dbname+"/(searchview)?Searchview&Query=("+Query+") &Start=1&SearchOrder=1&SearchMax=10000]]" 中,指定了在視圖(searchview)中查詢,如果首先定製form表單:$$SearchTemplate for(searchview),則會自動調用該form顯示,如果沒定製,則調用默認的搜索顯示錶單$$searchTemplateDefault

4內置域

  Form-表單名;SendTo-發件人;Subject-發件主題;

  SaveOptions

  如果是0則文檔不保存,默認是1

  MailOptions

  如果是1,則文檔關閉時要被郵寄,默認是0

  $$Return

  WEB下提交頁面的返回內容

  $$HTMLHead

  表示頁面HEAD的內容,

  $$HTMLBody

  表示頁面Body的屬性

  $Anonymous 1

  表示此文檔是由匿名錶單創建的匿名文檔

  $GroupScheduleShowLegend 1

  安排羣組日程時,決定是否顯示圖例

  $PublicAccess 1

  文檔中包含此域表示允許爲公共訪問文檔

  $$WebClient

  如果是WEB瀏覽器用戶,則自動包含在@UserRoles

  Auth_Type

  如果服務器支持用戶驗證而且 Script 被保護,這是用於校驗用戶的特定協議的驗證方法。

  Content_Length

  內容的長度,與客戶機給出的相同。

  Content_Type

  對於帶有附加信息的查詢,比如 HTTP POST 和 PUT,這是數據的內容類型。

  Gateway_Interface

  服務器所遵守的 CGI 規範版本。

  HTTP_Accept

  客戶機接受的 MIME 類型,通過 HTTP 標題指定。

  HTTP_Accept_language

  客戶機接受的語言,通過 HTTP 標題指定。

  HTTP_Referer

  用戶經常訪問的頁面的 URL 地址。

  HTTPS

  指示服務器是否啓用 SSL 模式。

  HTTPS_CLIENT_CERT_COMMON_NAME

  x.509 驗證字上的公共名稱

  HTTPS_CLIENT_CERT_ISSUER_COMMON_NAME

  x.509 驗證字的發行者

  HTTPS_KEYSIZE SSL 會話過程中的會話密鑰

  例如:40-bit128-bit

  Path_Translated

  服務器提供 PATH_INFO 的翻譯版本,它獲得路徑並能對其進行從虛擬地址到物理地址的任何映射。

  Query_String

後的信息,或在某些情況下是引用此 Script 的 URL 中位於 !* 後的信息。

  

  Query_String_Decoded 

  返回值與 Query_String 相同,但是將字符串解碼。例如:如果 URL 引用了一個包含不允許出現在 URL 中的字符的視圖名稱,此名稱會被編碼。此 CGI 變量將字符串解碼。Path_Info_Decoded 僅對於 Domino 應用程序可用。

  Remote_Addr

  發出請求的遠程主機的 IP 地址。

  Remote_Host

  發出請求的主機名稱。

  Remote_Ident 

  此變量會設置爲從服務器提取的遠程用戶名。僅登錄時使用此變量。

  Remote_User

  返回被驗證用戶名的驗證方法。

  Request_Content

  僅由代理支持。包含使用 HTTP POST 請求發送的數據。此數據經常是“URL 編碼的”,由用“&”連接的 name=value 對組成。例如: FirstName=John&LastName=Doe

  Request_Method 

  用於發出請求的方法。對於 HTTP,是“GET”、“HEAD”、“POST” 等等。

  Script_Name

  到被執行的 Script 的虛擬路徑,用於自引用的 URL

  Server_Name 

  服務器的宿主名稱、DNS 別名或 IP 地址,將出現在自引用的 URL 中。

  Server_Protocol

  與請求同時出現的信息協議的名稱和修訂。

  Server_Port 

  發送請求的端口。

  Server_Software

  運行 CGI 程序的信息服務器軟件的名稱和版本。

  Server_URL_Gateway_Interface

  服務器遵守的 CGI 規範的版本。

  $Readers

  如果設置了表單的讀者權限,則在文檔中會出現這個域

  $FILE

  如果文檔包含附件,則會出現這個域,RTF包含附件,不會出現

  $$ViewBody

  在web下嵌入視圖 

  $KeepPrivate

  爲1時文檔不可拷貝、打印、轉發

  $V2AttachmentOptions

  此值如果設置爲0就可以隱藏表單中的附件

  $VersionOpt

  控制記錄文檔的版本 

  FolderOptions

  在文件夾中放入新文檔 

  SecretEncryptionKeys

  使用密匙加密文檔不是公共密匙而是加密密匙 

  HTML

  將HTML直接傳遞給瀏覽器

  Versioning

  本字段規定用戶是否想要進行版本控制時可以使用如下選項 NoneNew versions become responses。當最初版本最爲重要的時候可以使用這個選項在視圖中會首先列出最初的文檔。

  Prior versions become responses  當新版本最爲重要的時候可以使用這個選項;

  在視圖中會首先列出最新的版本 New versions become siblings,當所有版本同樣重要的時候可以使用這個選項,在視圖中會首先列出最初的文檔。然後所有隨後的版本都會作爲附加主文檔緊隨其後進而避免重複或者衝突,但如果用戶決定要進行版本控制。

  那麼這裏可以有兩個創建版本選項  Manual-File, New Version可以在用戶選擇FileSave as New Version的時候立文檔的新版本   Automatic-File, Save可以在每次用戶保存文檔的時候 建立文檔的新版本。

5、 已知限制

數據庫的最大大小是多少?

最大的 OS 文件大小限制 -(最大爲 64GB

文本域的最大大小是多少?

15KB(存儲);15KB,顯示在視圖列中

RTF 文本域的最大大小是多少?

僅由可用磁盤空間限定,最大爲 1GB

RTF 文本域中單個段落的最大大小是多少?

64KB

一個層次結構視圖中有幾級響應;每一級中有幾個文檔?

31 級;300,000 個文檔

視圖、表單等的名字最多允許包含多少個字符?

數據庫標題:96 個字節

文件名:在 Windows 和 Unix 平臺上的最小限制爲 255 /或由操作系統限定; 本地的 Macintosh 工作站上爲 31

域名: 32

視圖名: 64

表單名: 32

代理名: 32

一個數據庫中可包含多少個域?

t3000(所有域名的總長度限制在 t64K)。可以啓用數據庫屬性“允許數據庫中包含多個域”以使得數據庫中的唯一命名域可到達 64K

一個表中可包含多少列? 64

一個表中可包含多少行? 255

可以向一個數據庫中添加多少視圖?

沒有限制;不過,隨着視圖數目的增加,用於顯示其他視圖的時間也會增加

可以向一個數據庫中添加多少表單? 

僅受數據庫大小限制。

一個視圖中允許有多少列?

289 個 10 字符列;取決於 或每列的字符數

可以向一個視圖中引入多少文檔?

文檔合計至少爲 350K

一個數據庫中可允許有多少個層疊視圖? 200

可輸入的頁邊距的最大值(以英寸計)爲多少? 46

可輸入的頁面裁減尺寸的最大值(以英寸計)爲多少? 46

可選擇/打印的最大字號是多少? 250

一個視圖中允許有多少文檔?

一個視圖索引最大可爲 130MB

最多可向“製表文本”中引出多少個文檔? 

僅受可用磁盤空間限制

一個“存取控制列表”中最多可有多少個項目?

t50 個名字(“存取控制列表”的大小不能超過 32767 字節)

一個“存取控制列表”中最多可有多少個角色? 75 個角色

可允許的標識符最大口令長度爲多少? 63 個字符

對於一個多口令標識符,最多可有多少個用戶擁有授權口令? 個用戶

全文索引引擎的保留字

TopicAND, NOT, OR, CONTAINS, NEAR, ACCRUE, EXACTCASE, TERMWEIGHT, PARAGRAPH, FIELD, SENTENCE.

如果想要繞開此限制,可以通過添加統配符的方式例如,如果想搜索"Topic"這個詞可以添加一個"*""Topic*". 或者把這個詞用雙引號括起來。

  

6。 Domino CGI變量

  公共網關接口CGI是外部應用與HTTP服務器進行交互的標準,當Web用戶保存文檔或者打開已有文檔的時候Domino Web服務器就會使用CGI變量收集用戶信息包括用戶名稱 瀏覽器 用戶的Internet協議 IP 地址。

  爲了在Web應用中收集這些信息 用戶可以採用以下兩種選擇1)使用與CGI變量相同的名稱建立字段2)使用LotusScript代理  

Domino所支持的CGI變量表 

  Domino可以通過字段或者LotusScript代理獲取以下CGI變量用戶還可以通過HTTP或者HTTPS提前獲取CGI變量。

Auth_Type

如果服務器支持用戶認證並且可以保護腳本那麼這個變量就是可以用於驗證用戶的特定於協議的認證方法 

Content_Type

對於那些具有附加信息的查詢例如HTTP POSTPUT這個變量就是數據的內容 

Content_Length

由客戶所提供的指定內容的長度 

Gateway_Interface

服務器用來進行編譯的CGI規範版本 

HTTP_Accept

HTTP頭信息所規定的客戶所能夠接受的MIME類型 

HTTP_Accept_language

HTTP頭信息所規定的客戶所能夠接受的語言 

HTTP_Referer

用戶用來在這裏獲取頁面的URL 

HTTPS

指出是否能夠爲服務器使用SSL模式 

HTTPS_CLIENT_CERT_CO

x.509憑證上的公共名稱 

MMON_NAME 

HTTPS_CLIENT_CERT_ISS  x.509憑證的發出者 

UER_COMMON_NAME 

HTTPS_KEYSIZE  SSL會話期間的會話鍵大小 例如40128

HTTP_User_Agent

客戶用以發送請求的瀏覽器 

Path_Info

由客戶提供的額外路徑信息相對服務器的HMTL根目錄,換句話說是可以通過腳本的虛擬路徑名稱以及緊隨其後作爲PATH_INFO發送的額外信息訪問腳本 

Path_Info_Decoded 

返回與Path_Info相同的信息但是會解碼字符串例如如果URL所引用的視圖名稱包含了URL所不允許的字符那麼就要對這個名稱進行編碼 這個CGI變量將會解碼這個字符串,Path_Info_Decoded 只能夠由Domino應用使用 

Path_Translated

服務器可以提供PATH_INFO的經過翻譯的版本它將會獲取路徑並且進行虛擬與物理之間的映射 

Query_String

在引用這個腳本的URL中 緊隨問號之後的信息 

Query_String_Decoded

返回與Query_String相同的內容只是對字符串進行解碼例如如果URL所引用的視圖名稱包含了URL所不允許的字符那麼就要對這個名稱進行編碼 這個CGI變量將會解碼這個字符串,Query_String_Decoded只能夠由Domino應用使用 

Remote_Addr

進行請求的遠程主機的IP地址 

Remote_Host

進行請求的主機名稱 

Remote_Ident

這個變量將會設置爲從服務器所獲取的遠程用戶的名稱使用這個變量,只能夠用於日誌記錄 

Remote_User

返回經過認證的用戶名稱的認證方法 

Request_Content

只用於代理包含隨HTTP POST請求發送的數據數據通常採用URL編碼 由使用&符號連接的名稱=值對構成 例如FirstName=John&LastName=DoeRequest_Method  能夠用於進行請求的方法 對於HTTP 這個方法可以是GETHEAD或者POST等 

Script_Name

正在執行的腳本的虛擬路徑用於自引用URL 

Server_Name

服務器的主機名稱DNS別名或者IP地址它會出現在自引用URL中 

Server_Protocol

這個請求使用的信息協議的名稱和修訂版本 

Server_Port

請求所發送到的端口 

Server_Software

運行CGI程序的信息服務器軟件的名稱和版本 

Server_URL_Gateway_ 

服務器進行編輯的CGI規範的版本

7。 出錯處理

Web開發中,公式必須用異常處理方式保護代碼

@IsError,特別是涉及DBColumnDBLookup的地方

7異常處理

所有過程或函數都需要提供完整的異常處理,以便於出現錯誤時的排除,原則

上只有涉及到非本系統模塊時需要屏蔽錯誤,如和RTX接口,和硬件接口等情況。

在整個代碼Declarations塊中聲明數據庫常量

Const DATABASE_NAME = test.nsf”’ 爲了防止代碼的互相調用,可以添加前綴,如COMMON_DATABASE_NAME

在所有過程(或函數)的代碼描述以後,直接聲明一個常量,最後爲異常處理代碼

Const FUNCTION_NAME = "Initialize"

  On Error Goto EHandle

  ……

  Exit Sub(Function)

  EHandle:

   Msgbox DATABASE_NAME + "-" + FUNCTION_NAME + "-" + Error + "-" + Cstr(Erl)

  End Sub(Function)

結果示例:

test.nsf-Initialize-Object is not set-19

原則上不推薦使用Print顯示異常信息,此結果只針對開發者有用,只有需要進行頁面跳轉時使用print

46  爲 Web 定製“表單已處理”確認信息  

  Web 用戶提交文檔後,Domino 使用缺省的“表單已處理”的確認信息迴應用戶。要重新設置缺省答覆,可將計算文本域添加到表單中,給此域命名爲 $$Return,並使用 HTML 作爲計算值來創建定製的批准。

顯示個人化答覆

下面的 $$Return 公式返回答覆“Thank you”,並附加上用戶姓名:

who:= @If(@Left(From; " ") = ""; From; @Left(From; " "));

@Return("<h2>Thank you, " + who + "</h2><br><h4>

<a href=/register.nsf/Main+View?OpenView>Main View</a>");

7顯示定製的錯誤消息

  要定製顯示給 Web 用戶的錯誤消息外觀,向數據庫中添加定製的錯誤消息表單。如果發生錯誤條件,且其定製表單存在,則 Domino 使用定製表單來顯示錯誤消息。否則,Domino 使用缺省錯誤消息表單。添加到數據庫的消息表單將覆蓋由管理員設置的服務器範圍內的消息。

  要在表單和錯誤條件之間創建關聯,創建擁有下列名稱之一的表單。然後創建名爲 MessageString 的可編輯的文本域來保存錯誤消息。添加要與錯誤消息一起顯示的其他文本、鏈接以及其他表單對象。

$$ReturnAuthenticationFailure 不能校驗用戶名稱和口令。

$$ReturnAuthorizationFailure 用戶對該數據庫沒有足夠的存取級別。

$$ReturnDocumentDeleted 成功刪除文檔。

$$ReturnGeneralError 出現了其他錯誤條件。

鏈接到另一頁面

根據提交文檔中的域值,在 HTML 中包括鏈接到另一頁面的 URL。下面的 $$Return 公式根據用戶選擇的範圍返回答覆。例如:如果用戶選擇歐洲,則消息“在意大利訪問我們的站點”將顯示一個鏈接,可鏈接到意大利的 Web 站點(假定公式中的“stdAnswer”和“stdFooter”已預先定義。)。

@If(Region="Asia"; stdAnswer + "<h2>Visit our site in <a href=\"<A href='http://www.japan.lotus.com\">Japanhttp://www.japan.lotus.com\">Japan</a></h2>" + stdFooter;

Region="Europe"; stdAnswer + "<h2>Visit our site in <a href=\"<A href='http://www.lotus.com\it_ciao/it_ciao.htm\">Italyhttp://www.lotus.com\it_ciao/it_ciao.htm\">Italy</a></h2>" + stdFooter;stdAnswer + stdFooter);

返回另一頁面

要跳轉到不同的 Web 頁面,可將頁面的 URL 用括號括起來放入頁面。當用戶提交文檔時,Web 客戶機將顯示引用的文檔。例如:下面的 $$Return 公式顯示 Lotus 日本站點的主頁。"[http://www.japan.lotus.com]"

7定製未找到文檔提示消息

1)onload事件執行如下函數即可 

function delstr()

{

var obj = document.getElementsByTagName("h2");

for (var i = 0; i < obj.length; i++)

{

  var getstr=obj.innerText;

  if (getstr.indexOf("未找到文檔")!=-1)

  {

    getstr=getstr.replace("未找到文檔","你要想換的字樣")

    obj.innerText = getstr;

  }

}

}

這種方法必須要在頁面下載完後才能執行,如果網絡太慢就不太好了.

2)在表單打用樣式表

h2{display:none} 

這種方法無法屏蔽表格< td>中產生的未找到文檔字樣

3)在標籤中加一個< tr>< /tr>不完整標籤

使未找文檔放於< tr>未找文檔< /tr>之間

這種方法會產生一條細線

4)在表單中使用@Elements(@DbColumn)公式來取得符合條件的文檔數

並根據是否爲0來隱藏視圖或顯示你定製的語句.

7所有數據提交時的數據校驗

強制規定校驗函數必須爲CheckValue(),必須在對應表單的OnSubmit中添加

Return CheckValue ();

8.安全性規則

8基於ACL的安全控制

區段存取

許多文檔中的數據有不同的敏感性你可能希望某些用戶不能更新或閱讀文檔中的某些內容而另外一些用戶則可以完全控制達到這個目標的一個方法就是將文檔分成不同的區段 並且對區段施加區段存取控制。

ACL權限分析

No Access不能存取者

根本不能夠訪問此數據庫,根本不能進行復制;

Depositor存放者     

可以創建文檔但不能夠閱讀編輯或刪除包括自己創建的文檔在內的所有文檔     不能接收到變化;

Reader 讀者

能夠閱讀文檔但不能創建編輯或刪除文檔,能夠獲得變化 但不能發送變化

Author作者 

創建與閱讀文檔自己的文檔,但只能編輯複製新文檔。

Editor編輯者

創建閱讀與編輯所有的文檔以及複製所有新的或變化了的文檔

Designer 設計者

可以修改所有的數據庫設計元素,可以修改複製公式並且可以創建全文索引,設計者也可以執行允許較低存取級別執行的所有任務。但它不能刪除數據庫或修改ACL。複製所有新的或變化了的文檔,也可以複製對設計的更改設計,但不能複製對ACL的更改。

Manager管理者

可以對數據庫做任何操作 可以複製任何變化。

  另外在ACL中有兩種缺省的服務器組  LocalDomainServers是本地域中的服務器所形成的組,OtherDomainServers是其他域中的服務器所形成的組,它們通常是其他組織的服務器而本組織的用戶可能需要去訪問它們

  要防止未註冊的用戶訪問數據庫你應該設置DefaultNo Access 如果Default需要更高的存取權限那麼應該在ACL中創建Anonymous項並且將其設置爲 NoAccess

   爲了允許來自Web客戶的訪問,你可能仍然想讓匿名用戶擁有一些最小的權限來有效地使用數據庫例如 你可以授予匿名用戶以下權限

    Reader允許訪問信息數據庫;

  Author允許訪問交互式數據庫;

  將Default與 Anonymous存取區分開,如果在ACL中沒有Anonymous匿名這一項,那麼Domino將按缺省的數據庫存取級別對匿名用戶訪問進行設置。

  而這種設置有可能超過了匿名用戶訪問所需要的級別,存取級別定義如下  :Default缺省 在ACL中沒有定義的用戶 

Anonymous匿名 組織中沒有有效Notes標識的用戶

8基於文檔存取的安全控制

  文檔的創建者通過在文檔屬性對話框的安全設置能夠決定誰可以閱讀這個文檔,可以選擇讓那些具有讀者或更高權限的用戶來閱讀文檔或者只讓有限的用戶閱讀文檔。

  文檔繼承用來創建它的表單的讀權限,任何被允許編輯文檔的人都可以更改文檔的讀訪問屬性

8基於域的安全控制

  每一個文檔都有一些特殊的域用來控制對它的訪問,這些域是讀者域 reader fields、作者域author fields與簽名域 signed fields

讀者域

  讀者域可以在表單中創建來設置對文檔的讀訪問限制,一個讀者域將列出所有允許對文檔進行讀訪問的名字 它可以用來替代或者與表單/文檔安全讀存取列表一起工作,如果讀訪問列表與讀者域同時存在那麼誰能夠閱讀文檔就由它倆共同決定,讀者域不允許對數據庫沒有讀訪問權限的用戶進行訪問。不過它能夠讓那些在數據庫ACL中可以正常閱讀文檔的某些用戶不能夠進行讀訪問。

  將一個域設計成讀者域並且使它可編輯將允許文檔作者看到名字列表列出的名字,可以從地址對話框數據庫ACL視圖對話框或作者手工輸入中獲得,有效使用讀者域的方法是創建這個域然後列出用戶與組來作者可以從中選擇。

作者域

  可以在表單中創建作者域來給那些不是文檔作者的人以作者的權力從而能夠編輯文檔,作者域也是要包含一個名字列表並且創建方法與讀者域相同,作者域只對那些對數據庫有作者權限的用戶有效。

簽名域

  在表單中創建簽名域將允許文檔在保存或郵寄時能夠附帶上數字簽名。數字簽名能夠保證作者的真實性並且保證文檔中的數據沒有改變,用戶標識符中的私有密鑰能夠生成簽名,Notes通過比較數字簽名與公用通訊錄中的公開密鑰來進行合法性驗證。

8基於代理的安全控制

1、作爲WEB用戶運行

  默認情況下,Web用戶以代理創建者的權限運行代理。然而在Design選項卡的代理屬性中選擇“作爲WEB用戶運行代理”時,可以指定WEB用戶代表自己(自己指創建者)運行代理。如果選定這個選項,系統會提示用戶輸入相關用戶名和密碼(已登錄則不用)。

  然後根據用戶名檢查數據庫ACL中的權限。 僅僅通過Notes客戶(不是WEB用戶)就可以創建代理。只有共享代理才能運行在WEB客戶上。WEB無調度機制,因此運行在WEB上的代理無法在預定義的時間運行。如果在代理創建過程中有設置代理何時運行,則該代理只適用於從Notes客戶運行的代理。代理操作對象選項則對所有代理有效。並且代表session.currentusername的不同。

WEB不支持以下四個選項: 

*視圖中所有未讀文檔  *視圖中所有文檔  *已選定的文檔   *粘貼的文檔 

在具體應用上比如設置了自動回覆郵件,如果不是作爲WEB用戶運行,那麼回覆郵件就會標明發信者是代理簽名者而不是真實用戶。

2、設置運行時安全性等級 3、查看和運行此代理的缺省權限

以上兩項一般設置選擇第二安全等級

4、允許有公共權限的用戶查看和運行此代理(只要可以訪問此數據庫的用戶都可以查看和運行此代理)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章