程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 充分利用EJB使移動工作群體變得強大

充分利用EJB使移動工作群體變得強大

編輯:關於JAVA

如果您的企業已經依賴於使用多層的企業 Java 應用,那麼您也許比想象中更接近無線科技的未來。通過描述一個樣本應用,Aashish Patil 向您展示了如何用最少的人力物力把您現有的企業 Java 基礎構件連接到無線網絡中去。使用現有的 EJB、修改過的 Servlet 以及新的 WML 和 WMLScript 頁面會使這個過程產生一個飛躍。

無線應用協議(Wireless Application Protocol,WAP)可以提高一個企業現有 Web 體系結構的含金量。如果您已經使用了企業 Java 應用,您可以容易地將它們與 WAP 服務集成,這樣可以為移動工作群體帶來有用的數據和功能。在這篇文章裡,我會涉及到使用與 WAP 相關的 J2EE 的基本要素,然後創建一個 WAP/企業 Java 樣本應用,以展示您如何把自己的 EJB 連接到無線網絡中去。

背景:J2EE 和 WAP

在閱讀本文前,您應該對 Java 2 平台,Enterprise Edition(J2EE)體系結構有個基本的了解。您可以通過下面的參考資料章節找到關於 J2EE 的更多信息的鏈接。作為一個回顧,下面是一張為台式客戶機設計的典型 J2EE 應用的示意圖。

圖 1 — J2EE 應用結構

在圖 1 中,包含 JavaServer Page(JSP)和 Servlet 的那一層負責生成動態 HTML 頁面。而在 WAP 應用中,這一層將生成動態的無線標記語言(Wireless Markup Language,簡稱 WML)頁面。因此,為了轉換一個標准的 J2EE 應用使之為移動設備所使用,您將不得不編寫新的 JSP,並且在某些情況下,還要編寫新的 Servlet。企業 JavaBean(EJB)保持不變,因為它們與數據表現無關。

有些人認為 Servlet 無需更改,或者說:只要把 Servlet 的輸出簡單地重定向到生成動態 WML 頁面的 JSP 上就已經足夠了。然而,Servlet 不能區別從台式機和從 WAP 設備發來的請求;既然 WAP 應用可能無法實現基於 Web 的體系結構的所有功能,所以在這方面並沒有混淆的地方,這一點很重要。也正由於此,開發人員通常為 WAP 應用設計新的 Servlet。然而在大多數情況下,這些 Servlet 與那些在基於 Web 的體系結構上提供類似功能的 Servlet 非常相似。

在圖 1 中沒有出現但對 WAP 應用又很重要的另一個組件是 WAP 網關。這個組件負責 WAP 棧和 Internet 棧之間的相互轉換。

圖 2 是圖 1 的改進版,顯示了使用 WAP 設備作為客戶端的 J2EE 應用的結構:

圖 2 — WAP/J2EE 應用的結構

按照圖示,所有自 WAP 客戶端到 Web 服務器的請求必須通過 WAP 網關發送。盡管 WAP 網關也可以作為放置 WML/WMLScript 頁面的 WAP 服務器,但使用 Web 服務器來放置這些頁面更為方便。

有很多 WAP 網關的部署方法。對於多數 WAP 應用來說,網關或由 ISP 部署,或由提供這個應用的公司來部署。後者更為安全,我們以後會解釋;然而,如果用戶要求在他們的 WAP 設備上進行多用途的網絡訪問,一個內部的 WAP 網關會很不方便。大多數非 ISP 不希望他們的網關被用來訪問他們自己站點以外的其他站點;因此,為了訪問其他站點,用戶將不得不使用 ISP 網關。但對於被 WAP 客戶端使用的每一個網關來說,用戶都必須定義一個不同的連接,正如 Windows 98 的撥號網絡一樣 — 而且在每個設備上,這樣連接的數目通常是有限的。這就增加了用戶的不便性,並且在訪問一個站點時造成 WAP 設備中的連接阻塞。

WAP 應用設計的考慮事項

當使用 WAP 時,一個習慣為台式客戶機編寫 J2EE 應用的開發人員會遇到一些新的挑戰。以下是在構建 WAP 應用時您也許會碰到的一些問題。

我可以在屏幕上顯示幾行信息?

事實上,對顯示多少行沒有特別限制,只要不超過面板的最大尺寸就行(隨設備的不同而不同)。然而,為了避免太多滾屏,每屏(即卡片)5 至 7 行最佳。

我應該考慮哪些安全問題?

一些電話不支持使用POST方法發送表單數據。因此,用戶名和密碼必須通過GET方法發送。在 WAP 網關上,如果日志功能被激活並且請求已被記錄,管理員就有能看到用戶名和密碼。如果網關是由 ISP 或其它第三方提供的,這個問題就會特別突出。

即使一個安全的連接也不能完全消除安全隱患。那些發送到 WAP 網關的數據使用 WTLS(Wireless Transport Layer Security)加密,它使用與標准 TLS 相同的算法。然而,發送到 WAP 網關的數據是二進制的編碼格式(對 WAP),所以這些加密後的數據必須用 TLS 解密和再加密以適用於因特網。經過一段時間以後,敏感數據在 WAP 網關上以明文的形式出現。黑客則會在適當的時刻,將內存中的信息轉儲出來,進而成功地訪問這些敏感數據。

按照注釋,解決該問題的一種辦法是在自己公司(而不是在 ISP)設一個 WAP 網關。在這種情況下,一個可信的人可以操作網關,並且可以關閉日志功能。

您也可以用 WMLScript 來編寫自定義的加密算法,以對客戶端的用戶名和密碼進行加密。這只有在使用簡單的算法時才有可能實現;在支持 DES 類的算法上,WMLScript 不夠強大。

我怎樣保持 Session?

WAP 客戶端不支持 Cookie。這樣,當用戶在您的站點的不同頁面之間穿梭時,為了在服務器端保留關於客戶端的信息,在向服務器發送每個請求的同時,一個 Session ID 必須被當作參數傳遞。Session ID 的參數名根據 Servlet 引擎的不同而不同。

有時,缺省的 Session ID 長度很大幅度地增加了每個請求的長度。結果導致客戶端或 WAP 網關可能將此請求看作一個無效的 URL 而拒絕。這樣有必要縮短 Session ID 的長度。請查看一下您正在使用的 Servlet 引擎的說明文檔中關於 Session ID 參數名的部分。如果您碰到過無效 URL 的錯誤,這個說明文檔也應提供有關縮短 Session ID 值長度的指南。

構造樣本應用

XYZ Ltd. 是一家生產 PDA,可佩戴的計算機,及其它普及計算設備的公司。公司的銷售人員拜訪客戶,提供 XYZ 產品的現場演示;某些演示要求銷售人員必須跑很遠的路去客戶那裡。那麼在路上,他們是怎麼收到客戶列表和其它重要數據的呢?

為此使用電子郵件會需要體積較大且昂貴的便攜式電腦或無休止的 Internet cafés 的搜索;在客戶端使用傳真機則更不切實際。取而代之的是 XYZ 的銷售人員會通過支持 WAP 功能的設備接收數據,例如手機或 PDA。使用移動設備,銷售人員能在拜訪客戶時向公司提供及時的反饋。公司就能馬上安排給客戶及時發貨並維護目前的銷售統計信息。

我們的應用有兩個主要目標。首先,我們流動的銷售人員應該能使用它在 WAP 設備上查看客戶列表。第二,如果一個客戶希望買貨,那麼銷售人員應能使用設備來下訂單。此外,任何 WAP 應用的一個重要目標應該是減少用戶必要的按鍵數目。由於受手持設備的用戶界面限制,用戶需要輸入的數據量應控制在最少。

這是一張顯示我們系統的體系結構的流程示意圖

圖 3 — 應用流程示意圖

用戶首先必須登錄以訪問系統;然後他們能浏覽客戶列表和每個客戶的詳細信息。如果他們希望為某一特定的客戶下訂單,那麼系統會提供他們一個產品列表,他們可以從中為該客戶選擇一個特定的產品。

在本文余下的大多數內容中,我們會討論實現該應用的 Servlet 和 JSP 代碼,並會考察 JSP 和 Servlet 一起工作的方式。關於每個 JavaServer Page 的討論還配有圖解,顯示了 JSP 在設備屏幕上的輸出。

清單 1,Login.jsp接受用戶名和密碼,並把它們作為參數來調用LoginServlet。對這個和其它所有的 JSP 來說,MIME 類型都應被設置成text/vnd.wap.wml類型。在傳遞請求的同時,上面的Login.jsp還傳遞了一個叫SessionID的參數。它必須與每個傳送到服務器的請求一起傳遞。參數名SessionID是一個占位符;請參考應用服務器的說明文檔,找到適用於您特定的應用服務器的正確的參數名。Java 方法HttpServletResponse.encodeURL(String URL)自動添加 Session ID;在我們的應用裡,這已經被廣泛地使用在 Servelet 中。

驗證空白的輸入域時會出現問題。在input標記裡有一個屬性,它讓您使輸入域不為空:

<input name="name" type="text" emptyok="false"/>

一個手機用戶必須訪問各個獨立的對話框屏幕去輸入數據。問題出現了,因為用戶寧願選擇直接訪問下一盒或下一張卡片而不願通過對話框屏幕去輸入數據。一個用戶面對如圖 4 所示的屏幕時也許會遺漏密碼並揿下 NEXT。

一個開發人員可以通過使用 WMLScript 的驗證來避免這個問題的發生(通過使用onclick事件)。然而,直到輸入一個值到輸入框以後,您傳遞到 WMLScript 函數的代表輸入域值的那個變量才開始被初始化。因此,若無密碼鍵入,傳遞到該函數的是未初始化的變量和腳本錯誤結果。這個問題的解決方法是在服務器端驗證所有的輸入域。

清單 2,LoginServlet是我們問題的解決方案:它可以認證銷售人員,並把他記錄在系統中。它也可以在服務器端為銷售人員創建一個 Session。代碼塊上的注釋指明了在哪裡這些操作會被執行。一旦成功登錄,設備顯示如清單 3 所示的主菜單(MainMenu.jsp)。

如圖 5 所示,該文件將兩個鏈接顯示在設備屏幕上。其中第二個終止了當前的 Session;第一個指向當前的客戶列表。在當前版本的程序流程中,銷售人員必須在開始任何銷售交易之前先從列表中選擇一個客戶;有關銷售產品的列表只能在後繼的屏幕上顯示(後面將會討論到細節)。也有其它可能的程序流:舉例來說,用來直接將用戶送到產品列表的鏈接可以被加到主菜單中。但是,您不應該在任一菜單中提供太多鏈接,否則支持 WAP 的設備的小屏幕會因此而變得混亂不堪。

在圖 5 的主菜單中揿下 View Clients 將調用清單 4 中的ClientViewServlet,它抽取銷售人員將要拜訪的客戶列表。代碼上的注釋說明了 Servlet 怎樣從客戶端上找到該信息。接著 Servlet 將列表放到 Session 對象中並調用ClientList.jsp。(這裡和下一段中提到的 Session 對象是來自於 Java servlet 包中的HttpSession類。)

清單 5,ClientList.jsp抽取由ClientViewServlet放置在 Session 中的客戶列表;它顯示了客戶的姓名,但不是完整的詳細信息(請參見圖 6)。當選擇一個用戶時,銷售人員則被定向到ClientDetails.jsp。

注意:顯示客戶列表的任務由三個獨立的部分完成 —ClientViewServlet、ClientList.jsp和ClientDetails.jsp。這樣設計的原因是什麼呢?

1、大多數 J2EE 架構的權威人士建議 JSP 不應該直接訪問 EJB;而應使用諸如 Servlet 的中間件來進行與 EJB 的交互。ClientViewServlet訪問 EJB 並獲得客戶列表。

2、這個應用本可以如此設計,這樣所有的用戶信息都會包含在一個單一的 WML 文檔中。在這個體系結構中,客戶列表包含在 WML 盒中的一張卡片上,而單個客戶的詳細信息會包含在同一盒中的不同卡片上。不過該單一文檔可能包含太多數據,以至於對一個低帶寬的 WAP 設備來說不能立刻下載。如果客戶數目過於龐大,所生成的數據總量很容易超過 WML 卡片盒所允許的最大容量。(最大容量隨設備不同而有所區別;如 Nokia 7110 的最大編譯卡片盒容量為 1.3 KB)。因此我們使用兩個 JSP:ClientList.jsp— 顯示客戶列表,還有ClientDetails.jsp— 顯示單個客戶的詳細信息。

清單 6,ClientDetails.jsp接受客戶數組的索引號作為參數,其中索引號在 Session 中出現。接下來它抽取所選客戶的詳細信息並顯示。如果銷售人員希望為該客戶下訂單,他只要揿下 Items 按鈕。這會調用清單 7,ItemListServlet,並且顯示該訂單的可選產品。

清單 7,ItemListServlet抽取銷售人員可以銷售的產品列表,並將列表置於 Session 中。然後它調用清單 8,ItemList.jsp。

清單 8,ItemList.jsp從 session 中抽取產品列表並顯示產品名稱。銷售人員可選擇一個產品去訂貨並揿下 Order 按鈕去調用PlaceOrder.jsp。數組中所選產品的索引被作為參數送到清單 9,PlaceOrder.jsp。

PlaceOrderServlet從 Session 中獲得銷售人員、客戶及產品的 ID。接著通過創建新的 Order Entity EJB 可以產生一個新的訂單。成功的下單顯示了訂單的 ID 和下訂單的時間。

在這一版本的應用中,銷售人員在完成交易後的唯一選擇便是返回主菜單(請參見圖 9)。您也可修改代碼以便使用戶返回到客戶或產品列表。

如果注意觀察,您會發覺銷售人員只輸入兩次數據:登錄時和為客戶輸入購買產品數量時。

關於代碼

附帶文件包含本文所有的 JSP 和 Servlet 代碼,也包含必需的 EJB 代碼。EJB 的 jar 文件和部署描述符也一起包含在內。所有屏幕截圖均來自 Nokia WAP 模擬器 2.0 版。

結論

就像前面提到的那樣,WAP 應用提供了非常好的增值服務。一個孤立的 WAP 應用是不可取的。然而,這樣一個應用無需花費很多財力人力就可以方便地集成到一個現有的 Web 應用體系結構中去。您所需要的唯一新硬件是一台機器,以及用於 WAP 網關的軟件;如果您使用的是自己 ISP 的網關,那麼這項開銷也可省去了。

現有的 HTML 頁面需要被轉換成 WML。然而,WML 不像 HTML 那麼復雜,因為它不支持 HTML 的許多功能。因此,這並不是一件費時的工作。

WAP 也支持無線 BitMap(WBMP)格式的圖片。然而,使用 WAP 設備的用戶在連接時間上花費了不少錢,他們更感興趣的是直接有效的信息而非奢華的界面。除非圖片本身能傳遞信息,否則提供快速的信息比占用帶寬和時間來傳輸圖片會更好。

最後注意事項:盡管模擬器可以提供測試 WAP 應用的良好環境,但只有當它配合已部署好的 WAP 網關,運行在所有可能的目標 WAP 設備上時,WAP 應用才算作真正意義上的被完全測試過了。所有動態生成的頁面在網關上被編譯。因此,有必要知道您的網關支持哪些版本的 WAP。如果網關編譯器只使用 WML 1.1,那麼用 WML 1.2 編寫的頁面是毫無用處的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved