posts - 9,  comments - 11,  trackbacks - 0

          簡介: IBM Lotus Forms 是 IBM 推出的電子表單解決方案,用于自動化基于紙質的流程,減少處理時間和出錯概率,提高流程處理效率。其中,Webform. Server 和 Viewer 作為用于展現表單的產品,為用戶提供了在桌面上和瀏覽器中查看和操作表單的功能。除此之外,這兩個產品還提供了 JavaScript. API,用于 HTML 頁面簡單方便地與 XFDL 表單進行交互,大大提高了 Lotus Forms 二次開發的速度。

          概述

          JavaScript. API 是用于通過編程與 Web 頁面中嵌入的 XFDL 表單交互的一組工具。通過 JavaScript. API,可以把一個已存在的靜態表單轉變為交互式的動態表單,非常容易地將 Lotus Forms 與其他應用集成。展示在 IBM Lotus Forms Viewer 和 IBM Lotus Forms Server – Webform. Server 中的表單都可以使用 JavaScript. API 進行控制和操作。JavaScript. API 允許我們使用熟悉的 JavaScript. 工具創建 HTML 頁面,與現有的 XFDL 表單進行動態交互,使用腳本在表單中插入或修改數據以及從表單中提取數據。

          可以使用 JavaScript. API 直接訪問整個表單及其所有元素節點。JavaScript. API 提供了操作表單中的輸入框等控件的功能。可以從嵌入 Web 頁面中的 XFDL 表單中提取信息,使用 JavaScript. 代碼加工處理,然后返回給同一個表單或同一個 Web 頁面中的其他表單。另外,也可以從表單中獲取數字簽名的信息,然后加以驗證或進行其他操作。

          圖 1 展示了在 HTML 頁面中使用 JavaScript. API 與 XFDL 表單交互的過程。


          圖 1. HTML 頁面中使用 JavaScript. API 與 XFDL 表單交互的過程
          圖 1. HTML 頁面中使用 JavaScript. API 與 XFDL 表單交互的過程

          FormNodeP 對象和 XFDL 對象是 JavaScript. API 的主要組成部分,下面將對其進行詳細介紹。


          FormNodeP 對象

          表單中的每個 XFDL 元素都對應一個 FormNodeP 對象,在加載表單的時候,代表表單本身的 FormNodeP 對象會被添加到 ibmForms 數組中。調用 JavaScript. API 的應用可以使用 ibmForms 數組作為起點。FormNodeP 對象包含了操作和控制表單的方法。可用于添加、修改、刪除和驗證表單內容。任何使用 FormNodeP 對象中的方法的 Web 頁面必須在腳本中包含 LF_FormNodeP.js 文件。FomNodeP 對象中的方法可以分為以下幾類:

          • 事件相關的方法:JavaScript. API 支持四種事件,即 onBlur、 onChange、 onClick 和 onFocus 事件。在 FormNodeP 對象中包含了對這四類事件的處理函數注冊和注銷方法。
          • 表單頁面元素及其屬性:可以使用 FormNodeP 中的方法讀取、添加和修改表單頁面元素及其屬性,例如為 combobox、list 或 popup 添加一個選項,復制或刪除一個表單頁面元素,或者操作表單中的附件等等。
          • Form. instance:可以使用 FormNodeP 提供的相關方法獲取或更新 form. instance,包括 XForms instance 和 XML model。
          • 數字簽名:FormNodeP 提供了用于驗證或刪除表單中的數字簽名的功能。

          XFDL 對象

          XFDL 對象包含從 Web 頁面中注冊和注銷表單的功能。為了使用 JavaScript. API,必須在腳本文件的開頭包含 LF_XFDL.js 文件。

          XFDL 中的 registerAPIExceptionHandler 方法用于注冊處理 JavaScript. API 拋出的異常的函數。registerForm. 方法用于注冊表單,將其添加到 ibmForms 表單數組中,這樣 JavaScript. API 可以訪問該表單。deregisterForm. 方法用于注銷原來注冊的表單。調用該方法后,JavaScript. API 不可以繼續訪問該表單。


          使用 JavaScript. API 創建與 Lotus Forms 表單交互的應用

          下面將通過一個實例展示如何使用 JavaScript. API 創建與 Lotus Forms 表單交互的 Web 應用。

          實例中的表單是采購系統中的一個簡化采購訂單表單,當用戶選定一個商品時,表單中會自動顯示出商品的報價和生產廠商的名稱及圖標;用戶添加需要采購的商品后對表單進行數字簽名;HTML 頁面獲得采購訂單的數據和數字簽名的狀態后提交到后臺進行處理。下面將列舉本實例中使用 JavaScript. API 的幾段代碼。

          本文中使用的完整表單及代碼詳見下載部分,可以使用 Lotus Forms Viewer 3.5.1 或 Lotus Forms Webform. Server 3.5.1 來打開該表單。

          在使用 JavaScript. API 的腳本的開頭部分,包含需要的 JavaScript. API 文件:


          清單 1.
          <SCRIPT. TYPE="text/javascript" SRC="LF_XFDL.js"></SCRIPT> 
          <SCRIPT. TYPE="text/javascript" SRC="LF_FormNodeP.js"></SCRIPT>


          清單 2. 在加載表單后,注冊商品名稱改變事件
          var theName = ibmForms["customFormName"].dereferenceEx(null, "PAGE1.LIST1", 
              0, FormNodeP.UFL_ITEM_REFERENCE, null); 
          theName.addOnChange(updatePrice); 
          theName.addOnChange(updateProducer); 
          theName.addOnChange(updateProducerIcon);

          用戶選定一個商品時,顯示商品的報價及生產廠商的名稱,代碼如下。


          清單 3. 通過更新 Instance 中的節點更新商品的單價
          function updatePrice() 
          { 
              ibmForms["customFormName"].
                  updateXFormsInstance(null,"instance('Generated')/wizardpage2/price",
                  null,"15.0", XFDL.UFL_XFORMS_UPDATE_REPLACE_TEXT) 
          }


          清單 4. 通過設置 XFDL 元素的值來更新生產廠商的名稱
          function updateProducer() 
          { 
              ibmForms["customFormName"].setLiteralByRefEx(null, 
                  "PAGE1.producer.value", 0, null, "IBM"); 
          }

          為了顯示生產廠商的圖標, 我們需要將圖標圖片的數據以附件的形式添加到表單中,其 JavaScript. API 代碼如下。


          清單 5. 添加圖片文件
          function updateProducerIcon() 
          { 
          
              var pageone = ibmForms["customFormName"].dereferenceEx(null, 
                  "PAGE1", 0, FormNodeP.UFL_PAGE_REFERENCE, null); 
          	
              var imageEncode = 
                  "H4sIAAAAAAAAC3P3dLOwTFRgUGA4xAAC////X8XwoYGh4QPDqg9A/
                  uxMhtAPij9ZGEGSOiACpJaBuVRi151/BmyGS1uV7t/
                  VKHcWKHIJ8HL+JfjGdF28zvkSWVGLZvFpgj/
                  6YvUUnpjyMS5JlNSxau9uDmHMsZnPt+TJqzmF3Vv0r5zeqrC1X/
                  vI88mLLj8wNa4U/
                  JaSPLvO36jWSV9AR11as7HJqL2mRkSum0uyr190sikngzUAvLfe4rAAAAA="
          	
              var encloseImage = pageone.encloseFile(imageEncode, 
                  "base64-gzip", "image/gif", null, "DATA1"); 
           }

          當用戶完成采購訂單并進行數字簽名后,提交訂單,在提交訂單前,需要驗證數字簽名,如果數字簽名驗證函數的返回值為 FormNodeP.UFL_DS_OK,則表示數字簽名有效。


          清單 6. 驗證數字簽名
          function verifySign() 
          { 
          	var signNode = ibmForms["customFormName"]
          	    .dereferenceEx(null, "PAGE1.SIGNATURE1", 0, 
          	    FormNodeP.UFL_ITEM_REFERENCE, null); 
          
          	var ret = ibmForms["customFormName"].verifySignature(signNode, false); 
          	
          	return ret; 
          
          }

          該實例中使用的表單和代碼祥見附件。

          有時,需要在同一個 Web 頁面中展示多個 XFDL 表單。當在同一個 Web 頁面中同時展示多個 XFDL 表單時,如果使用 JavaScript. API 處理 XFDL 表單,需要使用表單的文件名來區分不同的表單,示例代碼如下。


          清單 7. 多表單示例代碼
          if (!ibmForms["customFormName"] || !ibmForms["Form2.xfdl"] || !ibmForms["Form3.xfdl"]) { 
              alert("You must select a form. before you can start any tests..."); 
          }


          異常和錯誤處理

          在使用 Lotus Forms Javascript. API 時,有兩個發生異常的根源,一個是 JavaScript. 代碼,另一個是 Viewer 或 Webform. server 中的底層表單處理代碼。

          可以使用常規的方式處理 JavaScript. 代碼錯誤。例如,保持瀏覽器的默認行為或者使用 JavaScript. 的 try-catch 方式進行處理。

          JavaScript. API 的錯誤處理機制用于處理底層表單代碼拋出的異常。這些異常可以以 JavaScript. 警告的方式顯示,或者傳遞到自定義的異常處理器。可以使用 XFDL 對象的 registerAPIExceptionHandler 方法注冊自定義的異常處理方法。自定義的異常處理方法應該以 JavaScript. 錯誤對象 ex 做為輸入參數 , 實例代碼如下。


          清單 8. 用戶自定義的異常處理示例代碼
          function apiExceHandler(ex) { 
          
              alert("custom error handling"); 
              alert("name: " + ex.name); 
              var exDesc =  ex.description; 
              alert("description: " + exDesc); 
              var exMsg =  ex.message 
              alert("message: " + exMsg); 
          }


          Viewer 和 Webform. Server 中實現的區別

          很多時候,不管表單是由 Viewer 展示還是 Webform. Server,其使用 JavaScript. API 的方式是相同的。但是,有時可能需要根據選擇使用 Viewer 還是 Webform. Server 調整應用的設計。

          由于實現機制的不同,當使用 Webform. Server 展示表單時,使用 JavaScript. API 的應用可能有以下某些局限。

          • Web 頁面加載:在表單沒有完全加載到瀏覽器并注冊前,不能使用 JavaScript. API。但是,瀏覽器并不能控制頁面中不同部分的加載順序,即不能保證在 JavaScript. 應用訪問表單前表單已經加載完成并注冊。對于這種情況,Portlet 和 Servlet 分別有其不同的解決方法。當使用 Portlet 時,可以通過使用兩個 Portlet 來解決,一個 Portlet 用于展示 XFDL 表單,另一個 Portlet 中提供用戶控制 JavaScript. 應用的初始化的機制。當使用 Servlet 時,可以通過把 Web 頁面劃分成不同的 frame. 來解決。Frameset 元素的 onload 事件在所有 frame. 加載完成后發生,可以用于控制 JavaScript. 應用的初始化。
          • Web 頁面重新加載:盡管 Webform. server 中廣泛使用了 AJAX,但是某些操作仍然會引起頁面刷新,當頁面刷新并重新加載后,JavaScript. 的狀態信息會丟失,變量值和存儲的任何其它數據都會丟失。在 Servlet 中,可以使用 HTML frame. 來處理這種局限。Portlet 中則會比較復雜。需要采取措施以在頁面重新加載時保存 JavaScript. 應用的狀態。

          總結

          本文在介紹了 Lotus Forms JavaScript. API 后,結合實例向用戶詳細地介紹了如何使用 JavaScript. API 與 XFDL 表單動態交互,進行 Lotus Forms 的二次開發以及與其他系統的集成。本文還總結了 Lotus Forms JavaScript. API 中的異常和錯誤處理機制。最后,文章列舉了使用 Lotus Forms Webform. Server 的 JavaScript. API 的應用需要注意的局限及其解決方法。

          原文鏈接:http://www.ibm.com/developerworks/cn/lotus/forms-javascript-api/index.html


          posted on 2011-07-25 12:30 Mon$ter! 閱讀(318) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2011年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿

          隨筆檔案(11)

          文章分類

          最新隨筆

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大洼县| 思茅市| 扶余县| 铜川市| 贵阳市| 全椒县| 易门县| 大庆市| 吉木萨尔县| 峨山| 绥中县| 鹤山市| 田东县| 疏勒县| 海淀区| 白水县| 鹤庆县| 台江县| 化州市| 嫩江县| 恭城| 西乡县| 运城市| 太湖县| 历史| 梁平县| 桐庐县| 尼勒克县| 专栏| 邵武市| 常熟市| 北海市| 通化县| 合水县| 仙游县| 微山县| 万安县| 安化县| 大荔县| 潞西市| 西和县|