前言
本篇文章並沒有太多WebWork 的實戰代碼細節。本人非常希望能充當一名導遊的角色,帶領讀者逐步遊覽WebWork的功能特性和原理。在第一章,我們將提出基於三層架構的Web層需要解決的10個問題,這是本文的縱軸。圍繞著縱軸,我們按照橫軸的順序逐步描述講解:WebWork簡介、WebWork入門、WebWork原理、WebWork實戰和技巧、展望WebWork未來、最後是本文的總結。 基於三層架構的 Web 層需要解決的問題
我們這裡討論的Web層,是基於典型的三層架構:Web層,業務層,資料層。故,我們將不討論任何涉及業務(商務邏輯)層和資料層功能的實現。
Web層需要解決的問題:
1、 資料的輸入。如何獲得基於無狀態HTTP的請求資料。如何將請求的字元資料轉換為對應的模型對象。
2、 輸入資料的驗證。如何驗證輸入資料的合法性並給出明確的錯誤訊息提示 。
3、 資料的輸出。如何展現複雜的對象結構。如何處理複雜的展現邏輯。
4、 資料的傳遞和共用。如何在不同的請求或頁面之間傳遞和共用資料。
5、 頁面的流程管理。如何管理Web應用中的頁面流程。
6、 模組化的管理。如何將複雜的Web應用以模組化的方式管理。
7、 靈活可擴充的架構。如何支援各種不同的展現層技術。如何與業務層或資料層的各種架構整合。
8、 安全和存取控制的管理。如何提供基於Web的安全機制和資源存取控制的管理。
9、 代碼實現的簡潔和高效。如何讓開發步驟和代碼維護變得簡單。如何盡量減少開發的中間環節。如何將公用的功能剝離出來,並可以靈活的組裝應用。
10、 其它問題。非同步呼叫、國際化支援、檔案上傳、防止重複提交等等。
下面,讓我們來一起看看WebWork是如何解決上面的這些問題。
WebWork 簡介
WebWork是由OpenSymphony組織開發的,致力於組件化和代碼重用的J2EE Web架構。WebWork目前最新版本是2.2.2,現在的WebWork2.x前身是Rickard Oberg開發的WebWork,但現在WebWork已經被拆分成了Xwork1和WebWork2兩個項目,如下示意圖所示:
work簡潔、靈活功能強大,它是一個標準的Command模式架構實現,並且完全從web層脫離出來。Xwork提供了很多核心功能:前端攔截機(interceptor),運行時表單屬性驗證,類型轉換,強大的運算式語言(OGNL – the Object Graph Notation Language),IoC(Inversion of Control依賴倒轉控制)容器等。
WebWork2建立在Xwork之上,處理HTTP的請求和響應。所有的請求都會被它的前端控制器(ServletDispatcher,最新版本是FilterDispatcher)截獲。前端控制器對請求的資料進行封裝,初始化上下文資料,根據設定檔尋找請求URL對應的Action類,執行Action,將執行結果轉寄到相應的展現頁面。WebWork2支援多視圖表示,視圖部分可以使用JSP, Velocity, FreeMarker, JasperReports,XML等。
下面我們提到的WebWork將為WebWork2,使用的版本是WebWork2.2.2。
WebWork 入門 WebWork 安裝
如果只是搭建一個WebWork開發環境,那將非常簡單:
1、 去網站http://www.opensymphony.com/webwork下載最新的WebWork2.2.2項目。
2、 搭建一個Web應用(這個不難吧);並拷貝WebWork架構運行需要的所有Jar檔案到Web應用的WEB-INF/lib中。這些Jar檔案,可以在WebWork項目中lib/default目錄找到,即那個目錄裡面的所有檔案。當然,別忘記今天的“主角”,在WebWork跟目錄下的webwork-2.2.2.jar檔案。
3、 在Web.xml檔案中配置WebWork的前端控制器FilterDispatcher,也就是一個普通的Servlet Filter(過濾器)而已。代碼如下:
< filter >
< filter-name > webwork </ filter-name >
< filter-class > com.opensymphony.webwork.dispatcher.FilterDispatcher </ filter-class >
</ filter >
< filter-mapping >
< filter-name > webwork </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
不過如果是在實際項目中使用,安裝過程中還是有一些問題需要注意的:
1、 關於前端控制器。在以前WebWork2版本裡面,前端控制器是ServeltDispatcher,它是一個JavaServlet。而現在是一個Filter(過濾器),會導致無法在頁面中使用Jsp的include來包含一個WebWork的Action請求的URL。如果真的需要這樣做,可以使用WebWork的action標籤庫。
2、 關於Action請求URL的尾碼。我們知道,在一般的Web架構中,前端控制器會將特定尾碼的請求URL映射到對應的Action請求中。而我們這裡的前端控制器會接受任意的請求,但它預設是將.action結尾的URL映射為WebWork的Action請求。我們可以在webwork.properties檔案中,設定我們自己的尾碼名,多個尾碼名可以用逗號隔開。例如:webwork.action.extension=action,do
3、 在 Jsp 頁面中, WebWork 的標籤庫不需要在 web.xml 中定義,在頁面中通過如下的代碼直接引用: <%@ taglib prefix = "ww" uri = "/webwork" %>
4、 在Jsp頁面中,預設“altSyntax”是開啟的。它是用來解決標籤庫中的字串和運算式語言混淆的問題。所以,作為變數的運算式語言應該放在%{}中,否則WebWork會把它當作字串處理。
5、 如果展現層技術使用Freemarker(WebWork官方的推薦,也是我個人的推薦),如果在頁面中需要使用標籤庫,必須在web.xml中配置JspSupportServlet,代碼如下:
< servlet >
< servlet-name >