引言
WAF框架是Web Application Framework的簡稱,是在Sun Microsystems公司的J2EE藍皮書中提出的一個J2EE應用框架。該框架演示了在J2EE的技術架構下如何進行MVC的設計,以及如何充分組合使用J2EE中的各種設計模式。同時在Sun Microsystems公司的網站上還給出了架構于WAF框架之上的網上寵物商店的演示例子。在本文筆者將首先介紹WAF框架的主要特點以及J2EE的設計模式在該框架內的應用;然后將結合具體的電子商務系統開發的經驗討論WAF框架的擴展。
WAF框架
WAF框架是一個包括視圖層、控制層和數據層的綜合性框架,該框架在Web層和EJ B層使用了較多的設計模式來降低各個模塊之間的耦合性以及增加系統的擴展性。WAF框架的主要特點可以歸納如下:
1.?采用集中控制的方式處理請求
?目前對于客戶端的請求,可以采用多個Servlet進行分散的請求處理,也可以通過少數幾個Servlet進行集中的控制。前一種方式在進行一些系統通用的事務處理(比如登錄驗證,權限認證,編碼轉換等)時,會造成代碼的重復,從而增加了調試和維護的難度。而在WAF框架中通過集中的控制方式,可以對于系統的通用事務進行統一的處理,然后分發到各個模塊進行特定的處理。
2.?外部配置頁面流程
?在WAF框架中,請求處理之后的頁面流程都是通過外部文件來設定的,使開發者可以根據客戶的不同需要很方便地更改頁面的流程跳轉,提高了系統的擴展性和維護性。
3.?統一邏輯調用接口
?系統的邏輯處理分布在若干個EJB中,如果Web層直接去調用每一個EJB,會增加Web層和EJB層的耦合度,從而增加系統的維護的難度。而在WAF框架中,采用統一的邏輯調用接口,Web層的每一次請求都會通過這個邏輯調用接口再轉到具體的某個EJB來處理。
4.?動態合成頁面
?WAF框架把一個完整頁面分為幾個特定的區域(banner區域,left-bar區域,body區域,right-bar區域和footer區域),每一個區域可以任意配置一個子頁面,而整個頁面就是由這些子頁面配合構成。用戶可以通過外部配置文件任意配置頁面,子頁面也可以得到很大的重用。
?整個框架的流程如圖【1】所示,WAF框架可以簡單的劃分為WEB層和EJB層。
?WEB層的作用主要是從數據層獲取數據(通過EJB或者JavaBean的方式提供)顯示給用戶,同時收集用戶的請求信息,包裝成數據對象后傳遞給數據層處理。
?在WEB層,該框架使用Servlet2.3給出的過濾器機制來進行身份驗證和安全控制。通過外部配置文件來指定不同角色的用戶能夠瀏覽的頁面以及能夠提交的請求,這樣系統能夠很方便管理用戶角色以及控制用戶權限,增加了系統的擴展性。
Web層定義了兩個Servlet,其中的一個Servlet就是采用集中化的方式處理客戶端的邏輯操作的請求(圖【1】中標明的Front Control),而另外一個Servlet則處理客戶端的頁面請求(圖【1】中標明的Template Servlet)。Front Control根護客戶端的請求參數委托一個HTMLAction子對象構造一個針對該請求的數據傳輸對象(Event子類),然后傳遞請求給負責邏輯處理的EJB層,EJB層的處理結果將封裝成EventResponse對象返回到WEB層, Front Control會根據返回的結果來決定提供給客戶端的顯示頁面。從請求的類型到具體的HTMLAction對象的映射,以及從請求的類型和邏輯處理的返回結果到顯示頁面的映射,都是通過外部配置文件來指定的。系統能夠把不同的請求映射到同一個HTMLAction對象進行處理,使HTMLAction對象得到復用,同時系統也可以很方便地為某個請求改變結果頁面,使頁面流程的控制能夠靈活配置。
EJB層是真正進行邏輯處理和數據持久化的地方,Pet Store這個WAF框架的演示例子給出了通過實體Bean以及DAO的方式進行數據存取的方式。如果采用實體Bean的方式來獲取大數據量的只讀數據會因為構造過多的實體Bean對象而造成時間和空間上的浪費,而采用JDBC API直接從數據庫獲取大量的只讀數據能夠加快存取速度,同時減少內存中EJB對象的數目。在EJB層,WAF框架使用Session Fa?ade的設計模式,使所有Web層的請求都通過一個EJB Controller這個Session Bean來進行分發處理,這樣使Web層與EJB之間的耦合度達到最小。
??????????????????????????????????圖【1】 WAF框架流程控制
WAF框架在旅游電子商務系統中的擴展
筆者最近參與了一個電子商務系統的設計與開發,該系統就是基于WAF框架之上開發的。在整個設計過程中,我們發現為了迎合具體的電子商務系統的需求,我們需要對WAF框架進行一些改造和擴展,使其能夠更好的滿足這個電子商務系統的需求。
該電子商務系統對WAF框架的擴展主要表現在下面幾個方面:
登錄驗證模塊的擴展
在WAF框架中通過Servlet2.3的新特性Filter機制來實現用戶身份的驗證。如圖【2】所示,在SignOnFilter里對用戶請求進行過濾,該請求可以是一個頁面請求也可以是一個邏輯操作的請求。如果是登錄請求,則系統轉到登錄處理流程;而對于其他的請求,如果用戶已經登錄,則直接轉到下一個Filter進行過濾,而如果用戶未登錄,則比較外部登錄驗證配置文件,驗證用戶請求是否屬于受保護的請求(即只有已登錄的用戶發送該請求才能被系統處理),未通過驗證系統將跳轉到登錄頁面提示用戶登錄。
WAF框架中,只要是登錄的用戶就可以通過請求驗證,而實際的電子商務系統都往往說,當用戶登錄后還需要驗證用戶是否有權限提交該請求(如圖【3】所示)。而外部配置文件也需要根據不同的角色分別列出該角色能夠提交的請求列表。
圖【2】WAF框架的驗證模塊流程圖
圖【3】實際應用系統的驗證模塊流程圖
控制流程的擴展
在WAF框架中,用途提交的頁面請求(URI后綴為“.screen”)將被提交到Template Sevlet來進行處理,而如果用戶提交的是操作請求(URI后綴為“.do”),那么該請求將通過前臺控制器在HTMLAction子對象里包裝成Event子對象,然后再把Event子對象提交到EJB層進行處理。這個處理過程有很大的一部分時間是用在來回的通訊上。而在實際系統中,并非所有的操作請求都需要通過EJB層進行處理,對于一些簡單的請求在HTMLAction子對象里就可以完成。所以我們在實際系統中對WAF框架進行了改造,對于能夠在HTMLAction子對象中進行處理的操作請求,則該子對象返回空的Event對象;而在前臺控制器增加對返回的Event對象的判斷,只有Event對象不為空才轉到EJB層進行處理,否則直接跳轉到下一個頁面。
通過改變請求的處理流程,我們可以減輕EJB層邏輯處理的壓力,同時降低了請求響應的時間,使WAF框架的效率得到提高。
頁面流程模塊的擴展
在實際系統中,我們希望成功處理一個用戶的操作請求后,首先顯示一個操作成功的提示頁面,然后從這個提示頁面自動轉到一個指定的頁面。我們希望這個提示頁面能夠得到復用,任何一個操作請求得到成功處理都能夠使用該提示頁面。而在WAF框架中,一個操作請求成功完成后就直接轉到指定的頁面,這個是通過外部配置文件mapping.xml來完成的。現在我們在這個外部配置文件中增加一個可選的中間過渡頁面的設定,如果用戶設定了這個中間過渡的頁面,那么擴展WAF框架的系統能夠把指定的后一個頁面作為參數傳給中間過渡頁面,這樣在這個過渡頁面利用腳本語言經過一段間隔后就能夠自動轉到下一個指定的頁面里。下面是mapping.xml的一個片斷,粗體是增加的一個過渡頁面的設定
總結與展望
?WAF框架是一個覆蓋WEB層和EJB層的綜合性的框架,提供了很好的擴展性,因此能夠滿足對擴展性要求較高的商業系統的應用。隨著J2EE1.4規范的推出,相信WAF框架也將把更先進的思想和設計理念融入其中,使其不僅是學習J2EE的很好的例子,同時在商業上得到更好的應用。
參考文獻:
1.?http://java.sun.com/blueprints/code/jps131/docs/index.html
2.?Inderjeet Singh, Beth Stearns, Mark Johnson, and the Enterprise Team?“Designing Enterprise Applications with the J2EETM Platform, Second Edition”
3.?Java? 2 Platform Enterprise Edition Specification, v1.3