最佳實踐:為 Webform Server 開發 IBM Lotus Forms
轉自:http://www.ibm.com/developerworks/cn/lotus/forms-webform/index.html
IBM Lotus Forms 用於開發和向使用者交付資料驅動的、基於 XML 的電子表單(e-forms)。使用者可以使用 Lotus Forms Viewer 和 Webform. Server 檢視錶單。Lotus Forms Viewer 為表單特性提供全面的支援;Webform. Server 不要求在每個桌面都安裝客戶端應用程式。由於這個原因,Webform. Server 用於廣泛的使用者群體。
由於 Webform. Server 中 XFDL 到 HTML 的轉換,為 Webform. Server 開發 Lotus Forms for Webform. Server 與常規 Lotus Forms 開發實踐在以下方面不同:
- 轉換到 HTML 之後的佈局調整
- 從 Webform. Server 列印
- 表單特性行為差異
- 瀏覽器差異
- Webform. Server 產品限制
在 Lotus Forms 開發過程中,必須小心處理這些差別來滿足使用者的需求和期望。本文總結了在 Webform. Server 開發下處理 Lotus Forms 開發的最佳實踐,討論前面提到的方面。本文使用最新的 Webform. Server 3.5.1。針對 Lotus 的 IBM 軟體服務一直被 Lotus Forms 客戶應用到他們的專案上;這些主題是客戶在使用 Lotus Forms 和 Webform. Server 3.5.1 時最常遇到的問題。
此外,本文還闡述了幫助客戶瞭解 Webform. Server 行為的總體指導原則。
Lotus Forms Webform. Server 是 Lotus Forms 產品家族的一部分。它為 XFDL 表單攔截請求,將 XFDL 表單轉換成 HTML 和 JavaScript™,然後將已轉換的表單返回給使用者。它允許使用者在不安裝任何客戶端軟體的情況下檢視和完成表單。使用者可以在 Web 瀏覽器中瀏覽和完成表單,類似於其他在表單部署方面比較便捷的 Web 應用程式。
由於沒有客戶端軟體,所以 Webform. Server 沒有提供 Lotus Forms 支援的所有特性,但 Lotus Forms Viewer 提供完全的功能。這一差異使得針對 Webform. Server 的開發不同於針對 Lotus Forms Viewer 的開發。為了理解詳細的區別,讓我們先檢視 Webform. Server 3.5.1 的工作機制。
圖 1 展示了 Webform. Server 如何處理表單請求。客戶端瀏覽器將請求提交給表單應用程式(樣例 Webform. Server 應用程式或任意定製應用程式)。然後該應用程式呼叫 Webform. 伺服器轉換程式進行從 XFDL 到 HTML 的轉換。當 XFDL 轉換成 HTML 之後,HTML 被返回到客戶端瀏覽器並重新呈現。
使用者完成表單之後,處理表單提交類似於表單請求,如圖 2 所示。Web 應用程式和客戶端瀏覽器之間的請求都是 HTML 格式的。
從 Webform. Server 3.5 開始便引入了一個 Ajax 呼叫,從而改善 Webform. Server 使用者的體驗。通過引入 Ajax,表單上的一些動態計算不再需要重新整理頁面。JavaScript. 監聽器將行為和事件處理程式轉換成一個 Ajax 呼叫。然後,該呼叫被傳遞給 Webform. 伺服器轉換程式,並由該程式通過 Web 應用程式將 Ajax 響應傳送回到客戶端瀏覽器,如圖 3 所示。
Lotus Forms Viewer 和 Webform. Server 的區別
Webform. Server 的核心功能是將 XFDL 轉換成 HTML。所有 XFDL 項都由一個 HTML 小部件或 Webform. Server 中的 JavaScript. 來呈現。儘管Lotus Viewer 的主要特性在 Webform. Server 中得到支援,但鑑於以下原因還存在一些差別:
- HTML 存在很多難以克服的限制。
- JavaScript. 不能用於複製所有功能。
- Webform. Server 要求使用者具有不間斷的網路連線。
下面的幾個小節描述一些主要的差異。
表單檢視佈局
文字佈局稍微不同。
圖 4 顯示了在 Lotus Forms Viewer 中的佈局。
圖 5 在瀏覽器中顯示在 Webform. Server 中呈現的程式碼。
這種外觀上的差異很難讓這兩種佈局在 Lotus Forms Viewer 和瀏覽器中都呈現得很完美。還有兩個不受 Webform. Server 支援的 XFDL 項:幻燈和 RTF。
表單列印
在 Lotus Forms Viewer 中,輸出直接從 Lotus Forms Viewer 傳輸到列印驅動程式。在 Webform. Server 中,列印通過其他方式來實現。表單首先被轉換成 PDF 檔案或 GIF 影像。然後使用者使用 Adobe® Acrobat 或 Web 瀏覽器將 PDF 檔案或 GIF 影像傳輸到列印驅動程式。這種方法導致檢視結果和實際的列印結果之間出現差距。
限制檢查
在 Webform. Server 中,對使用者輸入的限制檢查不是主動的,而是被動的。在使用者從一個項切換到另一個項之前不會檢查使用者資料。如果資料不匹配格式,將標記為錯誤。這種方法意味著 Webform. Server 和 Lotus Forms Viewer 給使用者帶來不同的體驗。
附件
在 Webform. Server 中,使用者一次僅能將一個檔案附加到表單。但是在 Lotus Forms Viewer 中就不存在這種限制。
行為和計算
在 Webform. Server 中不能夠正確地重複一個行為。即使將一個行為設定為執行一次,它仍然在每次重新整理頁面時執行。現在一些計算被轉換成 Ajax,但並不是所有都轉換。當觸發計算時,使用者有時仍然能夠發現頁面被重新整理。Webform. Server 不支援某些事件模型,比如 popup/combo 中的啟用選項、擊鍵選項和滑鼠懸停選項。有一些事件模型計算可以通過轉換程式屬性配置檔案來啟用或禁用,比如 focused 和 focuseditem。
提交和電子郵件
資料提交的行為在 Webform. Server 中稍有不同。首先,它支援僅將資料傳送到一個 URL。其次,servlet 支援已計算的 URL,但前提是它們提交到執行 Webform. Server 的伺服器。在 portlet 中不支援已計算的 URL。
Webform. Server 不支援電子郵件功能;在工具欄上沒有電子郵件按鈕。即使表單上提供傳送電子郵件的按鈕,該按鈕在瀏覽器中不起作用。如果使用者需要使用電子郵件特性,那麼只能將表單儲存在本地磁碟,然後通過電子郵件傳送它。
XML 資料模型和 XForms
Webform. Server 仍然支援 XML 資料模型,但是不支援針對 XML 模型的 Smart Fill 和為 XML 模型嵌入的 Web 服務呼叫。
Webform. Server 支援所有與 XForms 相關的特性,包括 XForms 事件、模型和 XPath。一個小區別是 XForms 提交導致重新整理表單,但在 Lotus Forms Viewer 中不存在這種情況。
其他區別
其他一些區別包括:
- Webform. Server 支援 XFDL 6.0 及其以後的版本,而 Lotus Forms Viewer 支援 XFDL 5.0 及其以後的版本。
- Webform. Server 在 Microsoft® Internet Explorer 中省略不活動單元格,但在 Mozilla Firefox 中顯示它們。Lotus Forms Viewer 一般都顯示不活動單元格。
- Webform. Server 的 XForms 模式驗證僅限制在伺服器端。
- Webform. Server 不支援拼寫檢查。
當您使用 Webform. Server 開發表單時,必須考慮我們剛才提到的差別,以確保表單能夠正常工作。下面提供一些使用 Webform. Server 開發表單的最佳實踐,這是我們在參與幾個 Lotus Forms 服務專案時總結的成果。這些最佳實踐可劃分成 5 個類別:
由於 HTML 中的元素不像 XFDL 中的元素那樣存在畫素位置,所以當表單被轉換成 HTML 時元素位置就不再完全是原來的畫素位置。在瀏覽器中的佈局與在 Lotus Forms Viewer 和 IBM Lotus Forms Designer 中的 Design 檢視中的佈局稍微不同。
線上瀏覽器的佈局和列印紙張佈局也不同。您不能根據 Lotus Forms Designer 中的 Design 檢視中的位置來建立佈局。這種差別可能增加布局開發所需的時間,因為您必須在瀏覽器中檢查每個調整。
圖 6 展示了在瀏覽器中顯示的文字。
圖 6. 瀏覽器的文字佈局
圖 7 在列印 PDF 檔案中顯示了相同的文字。
圖 7. 在列印中的文字佈局
文字在列印時消失,即使它在瀏覽器中非常完美。解決該問題的辦法是在表單上使用兩個標籤。一個標籤用於線上瀏覽,另一個標籤用於列印。線上瀏覽標籤設定為列印時不可見。清單 1 顯示了樣例程式碼片段。
清單 1. 標籤和列印標籤
這種解決辦法能夠讓文字在兩種情況下很好地顯示。這種方法還適用於欄位和其他類似的情況。
在 Webform. Server translator.properties 檔案中有一些屬性用於控制 Webform. Server 的列印行為。表 1 列出了一些常用的列印設定並提供建議設定值。
表 1. 列印設定
名稱 值 最佳實踐 printOutputFormat png | pdf | pdfa | gif | plugin/png |plugin/gif 建議使用 PDF,它的影像列印效果比較好。 printPDFPageWidthInches 預設值:7 通常設定為大約比目標紙張的尺寸小 0.5 英寸。對於信紙,設定為 8 或 8.3。 printPDFPageHeightInches 預設值:9.5 通常設定為大約比目標紙張的尺寸小 0.5 英寸。對於信紙,設定為 10.5 或 10.6。 printPageLayout 預設值:shrinktopage 在一個方向選項中使用標題。 printRadioToCheck 預設值:true 如果客戶想要使用無線裝置傳送,那麼需要關閉該選項。 printScrollbarsOnFields 預設值:true 如果文字超出顯示範圍將被截掉,因此建議將該選項設定為 false。 在列印紙張表單時,有時需要調整頁面底部、頂部、左側和右側的邊沿。為了控制頁面邊沿,您可以使用表 1 中的 printPDFPageWidthInches 和 printPDFPageHeightInches 來調整邊沿。建議為表單元素的界線設定一個標準的 x,y 位置,然後在實際的頁面測試之後調整這兩個屬性。
如果頁面內容超出界線並且選擇了 shrink-to-page 選項,有時可能導致頁面變形。如果選擇了 title-in-one-direction 選項,將生成另一個空白頁。這種情況將導致一些頁面元素在頁面界線之外。
有時即使超越界線的元素不可見,但它們會生成一個多餘的空白頁,從而影響到頁面列印。要解決這個問題,必須確保所有頁面元素都在頁面界線之內,包括不可見的元素。
儘管 Webform. Server 支援不同版本的 Firefox 和 Internet Explorer,但瀏覽器支援 HTML 和 CSS 標準的本性導致它們之間出現差異。如果您想要表單在兩個瀏覽器中都完美地呈現,那麼必須小心地處理這一差異。其中一個方面就是下拉選單的行為。圖 8 顯示了在 Firefox 3 中的下拉選單。
圖 8. Firefox 3.0
圖 9 顯示了在 Internet Explorer 7.0 中的下拉選單。
圖 9. Internet Explorer 7.0
通過圖 8 和圖 9 可以看到下拉選單的寬度不一樣。在 Internet Explorer 7.0 下拉選單中的項不能完全顯示。確保下拉選單能夠在兩個瀏覽器中都完全顯示的唯一方法是為組合框分配足夠的寬度,從而讓文字能夠在兩個瀏覽器中完全顯示。
即使是相同瀏覽器的不同版本,您也能發現某些行為存在細微的差別。圖 10 顯示了表單在 Internet Explorer 7.0 中的一個例子。
圖 10. Internet Explorer 7.0
圖 11 顯示了表單在 Internet Explorer 6.0 中的例子。
圖 11. Internet Explorer 6.0
要避免該問題,一個最佳實踐就是在徵得客戶同意後在專案中只關注一個型別的瀏覽器。選擇 Internet Explorer 7 或 Firefox 3 比選擇 Internet Explorer 6 或 Firefox 2 好,因為前者對 HTML 和 CSS 的支援更好。
Webform. Server 有一些需要特別關注的獨特行為:
頁面重新整理
頁面通常在發生計算或行為之後重新整理。如果每個下拉選項或值填充都需要重新整理頁面,可能會讓使用者感到煩心。有時候,如果計算或 XForms 事件很複雜,瀏覽器端的響應時間就會變慢。沒有配置能夠改變該行為。唯一的解決辦法是讓表單邏輯保持簡單,並將複雜的邏輯從表單作用域移除,比如將其移動到後臺 servlet。按需頁面載入
全域性表單有一個選項允許您指定在表單開啟時載入哪個頁面。在圖 12 所示的例子中,載入了兩個頁面 PAGE1 和 SummaryPage,但沒有載入其餘的頁面。當表單比較大時,這個選項能夠改善表單的載入速度。在 Webform. Server 中,這個選項能夠幫助您避免載入大表單時出現記憶體不足的錯誤。
圖 12. 頁面載入
不過,當存在跨頁面引用時,該選項還能導致一個問題。如果一個計算引用另一個未載入的頁面上的項,該計算將不能完成,因為所引用的項沒有載入到記憶體中。對於這種情況,需要載入被其他頁面引用的所有頁面。另一個辦法是確保被引用的頁面在頁面導航順序中首先載入。
XForms-ready 效能
有兩個 XForms 事件可用於在表單載入時執行函式:XForms-ready 和 xforms-model-construct-done。在 Webform. Server 中,這兩個事件的響應時間是不一樣的,因為 Webform. Server 以不同的方式呈現它們。表 2 顯示了通過 Webform. Server 呈現表單時的詳細效能測試結果。
表 2. 響應時間對比
響應時間 xforms-ready xforms-model-construct-done 伺服器響應時間 8.44 s 5.70 s 第一瀏覽器響應時間 13.02 s 9.85 s 平均瀏覽器響應時間 10.14 s 7.10 s 從表 2 中顯示的測試結果可以看到,很明顯 xforms-model-construct-done 的效能更好。在呼叫 xforms-ready 之後,需要再次呼叫 UI 呈現,但在呼叫 xforms-model-construct-done 之後,不需要再次呼叫 UI 呈現。在這裡,建議對任何沒有呼叫 UI 更新的邏輯使用 xforms-model-construct-done,以縮短響應時間。
Webform. Server 產品存在一些已知的但又無法解決的限制。例如:在一個列印 PDF 頁面上,核取方塊的邊框不能正確顯示,並且在實際列印出來的頁面上,核取方塊的顏色是灰色的。這個限制可能會給使用者帶來困惑,如圖 13 所示。
圖 13. 核取方塊
下面是我們從幾個服務專案中學到的技巧:
- 不可能在所有訪問方法(檢視、Webform. Server、列印頁面)中都實現完美的表單,這是由 Webform. Server 的性質決定的。在開始開發之前,應該和客戶達成協議,應該使用哪種訪問方法作為開發和測試的基礎。
- 客戶需要了解在 Webform. Server 下開發表單需要花費更多時間。此外,還要考慮本文介紹的一些技術和注意事項,這讓表單的開發更慢。
- 存在一些產品限制因素,它們導致 Lotus Forms Viewer、線上佈局和列印 PDF 檔案之間出現不一致的情況。客戶需要了解這些差異並接受專案中存在的風險。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-629208/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel 開發最佳實踐Laravel
- SQL Server Integration Services最佳實踐BTSQLServer
- SpringCloud 微服務最佳開發實踐SpringGCCloud微服務
- SQL Server安全設定最佳實踐SQSQLServer
- iOS原生混合RN開發最佳實踐iOS
- 最佳實踐丨雲開發CloudBase多環境管理實踐Cloud
- SpringBoot優雅開發REST API最佳實踐Spring BootRESTAPI
- Go 單體服務開發最佳實踐Go
- Go單體服務開發最佳實踐Go
- Laravel 5.7 最佳實踐和開發技巧分享Laravel
- Android開發中API層的最佳實踐AndroidAPI
- 雲中SQL Server高可用性最佳實踐SQLServer
- DevOps最佳實踐之應用開發和部署dev
- 寫給自己的git多人開發最佳實踐Git
- iOS 開發者的 Weex 偽最佳實踐指北iOS
- HTTP/2之伺服器推送(Server Push)最佳實踐HTTP伺服器Server
- 我認為的 Runloop 最佳實踐OOP
- iOS BLE 開發小記[6] 設定本地裝置為 Peripheral 的最佳實踐iOS
- 軟體開發中的10個最佳實踐技巧!
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 開發篇SpringGCCloud
- 使用 Mpvue 開發微信小程式的最佳實踐Vue微信小程式
- mock server 實踐MockServer
- 阿里巴巴 Dubbo Nacos 服務發現開發最佳實踐阿里
- Python將字串轉為字典最佳實踐Python字串
- Node.js 最佳實踐 —— 如何在 2018 年成為更好的 Node.js 開發者Node.js
- 雲擴研習社 | RPA流程開發最佳實踐(上)
- 雲擴研習社 | RPA流程開發最佳實踐(下)
- 最佳實踐丨雲開發CloudBase內容稽核能力Cloud
- iOS開發 -卡死崩潰監控原理及最佳實踐iOS
- 漫談 React 元件庫開發(二):元件庫最佳實踐React元件
- 使用Scala開發Apache Kafka的TOP 20大最佳實踐!ApacheKafka
- 讀軟體開發安全之道:概念、設計與實施16安全開發最佳實踐
- 我所認為的RESTful API最佳實踐RESTAPI
- 《SpringBoot實戰開發》——基於Gradle+Kotlin的企業級應用開發最佳實踐Spring BootGradleKotlin
- 金融科技行業軟體開發的安全類最佳實踐行業
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(開發部署)SpringGCCloud
- Vue開發總結 及 一些最佳實踐 (已更新)Vue
- 大型開發專案中 git 工作流的最佳實踐Git
- 有贊開源專案最佳實踐