必威电竞|足球世界杯竞猜平台

webwork
來源:互聯(lián)網(wǎng)

WebWork是由OpenSymphony組織開發(fā)的,致力于組件化和代碼重用的JBossWeb框架。現(xiàn)在的WebWork2.x前身是Rickard Oberg開發(fā)的WebWork,但現(xiàn)在WebWork已經(jīng)被拆分成了Xwork1和WebWork2兩個項目。

介紹

WebWork是建立在稱為XWork的Command模式框架之上的強大的基于Web的MVC框架。

如下示意圖所示:

work簡潔、靈活功能強大,它是一個標(biāo)準的Command模式框架實現(xiàn),并且完全從web層脫離出來。Xwork提供了很多核心功能:前端攔截機(interceptor),運行時表單屬性驗證,類型轉(zhuǎn)換,強大的表達式語言(OGNL – the Object Graph Notation Language),IoC(Inversion of Control依賴倒轉(zhuǎn)控制)容器等。

WebWork2建立在Xwork之上,處理HTTP的請求和響應(yīng)。所有的請求都會被它的前端控制器(ServletDispatcher,最新版本是FilterDispatcher)截獲。前端控制器對請求的數(shù)據(jù)進行包裝,初始化上下文數(shù)據(jù),根據(jù)配置文件查找請求URL對應(yīng)的Action類,執(zhí)行Action,將執(zhí)行結(jié)果轉(zhuǎn)發(fā)到相應(yīng)的展現(xiàn)頁面。WebWork2支持多視圖表示,視圖部分可以使用JSP,Velocity,FreeMarker,JasperReports,XML等。

下面我們提到的WebWork將為WebWork2,使用的版本是WebWork2.2.2。

原理

WebWork的網(wǎng)站上提供了一個完整的WebWork架構(gòu)圖。它描述了從客戶端的一次請求到最后服務(wù)器端響應(yīng)的整個執(zhí)行過程。架構(gòu)圖如下:

此架構(gòu)圖一共分為五個部分,其中五個部分分別由五種不同顏色表示。

1.淺灰色方框。分別代表了客戶端的一次Http請求,和服務(wù)器端運算結(jié)束之后的一次響應(yīng)。

2.淺紅色方框。表示一次Action請求所要經(jīng)過的Servlet filters(Servlet 過濾器)。我們可以看到最后一個filter就是我們前面介紹的WebWork的前端控制器。

3.藍色方框。這是WebWork框架的核心部分。

1)一次請求到了WebWork的前端控制器,它首先會根據(jù)請求的URL解析出對應(yīng)的action 名稱,然后去咨詢ActionMapper這個action是否需要被執(zhí)行。

2)如果ActionMapper決定這個action需要被執(zhí)行,前端控制器就把工作委派給ActionProxy。接著她們會咨詢WebWork的配置管理器,并讀取在web.xml文件中定義的配置信息。接下來ActionProxy會創(chuàng)建ActionInvocation對象。

3)ActionInvocation是Xwork原理的(Command模式)實現(xiàn)部分。它會調(diào)用這個Action已定義的攔截器(before方法),Action方法,Result方法。

4)最后,看上面流程的圖的方向,它會再執(zhí)行攔截器(after方法),再回到Servlet Filter部分,最后結(jié)束并傳給用戶一個結(jié)果響應(yīng)。

4.色方框。這是攔截器部分,在上面的攔截器章節(jié)我們已經(jīng)有了詳細的介紹。

5.黃色方框。這是我們在開發(fā)Web應(yīng)用時,需要自己開發(fā)的程序。其中包括:Action類,頁面模板,配置文件xwork.XML

核心概念

WebWork的三個關(guān)鍵部分

1.Actions。一般一個Action代表一次請求或調(diào)用。在WebWork中,一般Action類需要實現(xiàn)Action接口,或者直接繼承基礎(chǔ)類ActionSupport。這是,它要實現(xiàn)默認的execute方法,并返回一個在配置文件中定義的Result(也就是一個自定義的字符串而已)。當(dāng)然,Action也可以只是一個POJO(普通Java對象),不用繼承任何類也不用實現(xiàn)任何接口。Action是一次請求的控制器,同時也充當(dāng)數(shù)據(jù)模型的角色,我們強烈建議不要將業(yè)務(wù)邏輯放在Action中。

2.Results。它是一個結(jié)果頁面的定義。它用來指示Action執(zhí)行之后,如何顯示執(zhí)行的結(jié)果。Result Type表示如何以及用哪種視圖技術(shù)展現(xiàn)結(jié)果。通過Result Type,WebWork可以方便的支持多種視圖技術(shù);而且這些視圖技術(shù)可以互相切換,Action部分不需做任何改動。

3.Interceptors。WebWork的攔截器,WebWork截獲Action請求,在Action執(zhí)行之前或之后調(diào)用攔截器方法。這樣,可以用插拔的方式將功能注入到Action中。WebWork框架的很多功能都是以攔截器的形式提供出來。例如:參數(shù)組裝,驗證,國際化,文件上傳等等。

特點

ValueStack 和 EL

關(guān)于ValueStack的描述:

1.ValueStack其實就是一個放置Java對象的堆棧而已,唯一特別的是可以使用EL來獲得值堆棧中對象屬性的數(shù)據(jù),并可以為值堆棧的對象屬性賦值。

2.EL,全稱Express Language,即表達式語言。不要被語言嚇倒,它是簡單的對象導(dǎo)航語言。有字符串(例如:方法名)和特殊字符組成(例如用。表示調(diào)用對應(yīng)的屬性方法)。通過EL,我們可以存、取對象數(shù)據(jù),而且還可以直接訪問類的靜態(tài)數(shù)據(jù),調(diào)用靜態(tài)方法。

3.WebWork的ValueStack底層有第三方開源項目對象導(dǎo)航圖語言實現(xiàn)。所以EL也都遵循OGNL的規(guī)范。我們在開發(fā)中,幾乎不需要知道OGNL的細節(jié)。

4.WebWork為每一次請求構(gòu)建一個ValueStack,并將所有相關(guān)的數(shù)據(jù)對象(例如:Action對象、Model對象等)放到ValueStack中。再將ValueStack暴露給視圖頁面,這樣頁面就可以直接訪問后臺處理生成的數(shù)據(jù)。

下面我們用一個雇員類為例,使用junit框架(單元測試框架)來展示ValueStack的功能。

我們有一個Employee類,它有兩個屬性:姓名,地址。姓名是一個字符串,地址是一個對象,地址類有國家、城市、街道三個屬性。

Interceptor( 攔截器 )

關(guān)于攔截器的描述:

1.一個攔截器就是在xwork.XML文件中定義的一個無狀態(tài)Java類,它至少要實現(xiàn)XWork的com.opensymphony.xwork.interceptor.Interceptor接口。

2.實現(xiàn)Interceptor接口的攔截器,代碼部分在intercept方法中實現(xiàn)。在intercept方法中,可以直接返回一個Result字符串,這樣整個執(zhí)行直接“短路”,這時Action的execute方法也不會執(zhí)行(一般很少會這么用)。所以,一般都會在這個方法里調(diào)用參數(shù)對象invocation的invoke方法,并返回這個方法執(zhí)行的結(jié)果。這樣會持續(xù)執(zhí)行后面的攔截器方法以及Action的execute方法等。

3.大部分的時候,攔截器直接繼承WebWork的抽象類com.opensymphony.xwork.interceptor.AroundInterceptor就可以了。這時,需要實現(xiàn)它的before和after方法。Before方法會在Action執(zhí)行之前調(diào)用,after方法在Action執(zhí)行之后調(diào)用。

4.?dāng)r截器的執(zhí)行順序。我們可將多個攔截器放一起組裝成一個攔截器棧。這樣攔截器會按照棧的順序由上而下執(zhí)行before方法,所有before方法執(zhí)行結(jié)束,再執(zhí)行Action的方法,執(zhí)行Result的方法,再返回執(zhí)行結(jié)果,最后再從下而上執(zhí)行攔截器的after方法。

5.?dāng)r截器的過濾功能。我們通常會在應(yīng)用中使用一個通用的定義多個攔截器的攔截器棧。但有些Action方法在調(diào)用的時候,不需要要其中的部分攔截器。這時,我們就可以使用攔截器過濾功能。如果攔截器要擁有過濾功能,必須實現(xiàn)抽象類com.opensymphony.xwork.interceptor.MethodFilterInterceptor。這樣,攔截器在定義的時候或者在Action引用攔截器棧的時候,我們就可以指定哪些Action方法是需要過濾的,哪些Action是不需要過濾的。

提供的攔截器介紹

1.自動為Action設(shè)置Http請求數(shù)據(jù)的攔截器(Parameters Interceptor)。這個攔截器非常方便實用,但完全自動組裝對象數(shù)據(jù),很可能會帶來安全問題。如果Action不需要設(shè)置數(shù)據(jù),那么這個Action只要實現(xiàn)com.opensymphony.xwork.interceptor.NoParameters接口即可。如果是Action中部分數(shù)據(jù)需要自動設(shè)置,部分數(shù)據(jù)不允許設(shè)置,這樣可以實現(xiàn)接口com.opensymphony.xwork.interceptor.ParameterNameAware,可以在這個接口的acceptableParameterName(String parameterName)方法中,定義我們可以接受哪些方法,如果允許只要讓這個方法返回True就可以了。

2.過濾參數(shù)功能的攔截器(Parameter Filter Interceptor)。它可以全局阻止非法或不允許Action訪問的參數(shù)。可以很好的和上面的組裝參數(shù)的攔截器一起使用。

3.為Action設(shè)置靜態(tài)數(shù)據(jù)的攔截器(Static Parameters Interceptor)。它可以將Action定義的靜態(tài)參數(shù),設(shè)置到Action中。

4.?dāng)?shù)據(jù)驗證攔截器(Validation Interceptor)。定義之后,會調(diào)用驗證文件或?qū)崿F(xiàn)驗證接口com.opensymphony.xwork.Validateable的所有驗證。

5.驗證流程處理攔截器(Workflow Interceptor)。它和上面的攔截器一起使用,處理驗證的流程。如果驗證通過則繼續(xù)前進,如果發(fā)現(xiàn)有驗證錯誤消息,直接轉(zhuǎn)到Action中定義的輸入結(jié)果(input)頁面。

6.類型轉(zhuǎn)換錯誤處理攔截器()。它首先去取得類型轉(zhuǎn)換的錯誤消息(主要是由設(shè)置Http請求參數(shù)的攔截器產(chǎn)生),如果取到錯誤消息,它會將錯誤消息傳遞給實現(xiàn)接口com.opensymphony.xwork.ValidationAware的Action,這樣我們可以將這些錯誤消息暴露到頁面中。

7.Action鏈攔截器(Chaining Interceptor)。它是用來拷貝前一個Action的屬性數(shù)據(jù)到當(dāng)前Action中。它要求前一個Action必須是chain Result(),這樣才能進行Action的數(shù)據(jù)拷貝。

8.防止頁面重復(fù)提交(或頁面重復(fù)刷新)攔截器。Token Interceptor和Token Session Interceptor都是防止重復(fù)提交的攔截器。不同點是后者在Session存貯了最近一次請求的結(jié)果數(shù)據(jù)。

9.文件上傳的攔截器(File Upload Interceptor)。實現(xiàn)文件上傳的功能。如果有人曾經(jīng)手工寫過文件上傳程序,那一定會驚嘆于這個攔截器。我們可以在這個攔截器中設(shè)定上傳文件的大小和類型限制。記得需要第三方的文件上傳庫的支持,只要在webwork.properties中配置過,并拷貝相應(yīng)的jar包就可以了。

10.進度條等待攔截器(Execute and Wait Interceptor)。當(dāng)Action的執(zhí)行需要很長時間的時候,我們可以使用這個進度條等待的攔截器。它會將Action放到后臺執(zhí)行,而在前端顯示進度條或等待消息提示的頁面。

11.還有一些其它不常用的攔截器,我們可以在WebWork文檔中找到,這里就不再做介紹。

使用技巧

限于篇幅,我們無法在本章節(jié)給出很多詳盡的具體實例。其實,在WebWork的代碼包中,有一個非常好的演示項目——showcase,它用例子演示了WebWork的幾乎所有特性。值得初學(xué)的朋友反復(fù)研究。

1.多視圖支持。WebWork框架天生支持多種視圖技術(shù),包括:Jsp、FreeMarker、Velocity、Jasper Reports、XSLT,還有其它的視圖技術(shù)。這將在敏捷項目中特別有用。在我咨詢的項目中,就有一個因為技術(shù)的原因,視圖技術(shù)由最先的Jsp改為Velocity,后來又改造為FreeMarker。其中,Action類以及后臺的程序沒有做任何的改動。如果您需要一個視圖展現(xiàn)層技術(shù),我在這會好不猶豫的向您推薦FreeMarker。這也是官方的推薦。

關(guān)于視圖技術(shù)的使用,首先是搭建視圖技術(shù)運行的環(huán)境。然后就是編寫頁面腳本,最后就是在xwork.XML文件中配置。Xwork配置文件中,Result的type參數(shù),就是用來標(biāo)示所使用的視圖技術(shù)。在showcase項目中,使用到的視圖技術(shù)有:Jsp、FreeMarker、Velocity、Jasper Reports。

2.Action的數(shù)據(jù)驗證功能。在WebWork中,可以在三處實現(xiàn)數(shù)據(jù)驗證功能。一、驗證文件(例如:ActionClass-validation.xml文件)中定義數(shù)據(jù)驗證規(guī)則。二、在Action中實現(xiàn)com.opensymphony.xwork.Validateable接口的validate方法。三、在Action的執(zhí)行方法中,硬編碼實現(xiàn)驗證功能。當(dāng)然,在實現(xiàn)驗證時,我們盡可能的用前面兩中方法。

關(guān)于驗證的說明:

1)、第一種驗證需要“validation”攔截器的支持。并可以從任意層次綁定驗證文件,可以為一個Action類綁定一個驗證文件,也可以為一個具體在xwork.XML文件中的Action定義綁定一個驗證文件,可以為Action的一個屬性對象綁定一個驗證文件,甚至可以為Action的父類綁定驗證文件。

2)、WebWork為驗證文件提供了一些標(biāo)準的驗證實現(xiàn):例如:字段必須填寫,整型、E-mail地址等等。我們也可以使用表達式語言實現(xiàn)更復(fù)雜的數(shù)據(jù)驗證。

3.類型轉(zhuǎn)換。前面外面一直提到過,WebWork會自動從請求的字符串參數(shù)中組裝Action需要的數(shù)據(jù)對象。這樣,就會存在一個類型轉(zhuǎn)換的問題。如果Action的字段是基本類型或是一個數(shù)據(jù)對象,WebWork會自動幫我們處理。如果Action的字段是一個集合,或者我們需要特定的類型轉(zhuǎn)換,這時,我們可以在類型轉(zhuǎn)換的定義文件(ClassName-conversion.properties)中定義轉(zhuǎn)換規(guī)則。

4.一個Action的多個執(zhí)行方法。WebWork的Action是基于Command模式的實現(xiàn),在WebWork中,除了實現(xiàn)Action接口的execute()方法之外,Action還可以定義多個執(zhí)行方法。這些方法必須要是無方法參數(shù),并且返回返回字符串的方法。這樣我們在Url中可以用類似下面的格式訪問:actionName!methodName.action,例如user!doAdd.action,調(diào)用user Action類的doAdd方法。在最新的WebWork中,Action類甚至可以不實現(xiàn)Action接口。

5.Action鏈(Action Chaining)。在WebWork中,一次用戶請求,可由多個Action共同完成。每個Action可以只實現(xiàn)自己本身的功能單元,這樣我們可以根據(jù)業(yè)務(wù)需要為用戶的一次請求選擇一個或多個Action功能單元來實現(xiàn)。在這樣的多個Action之間可以通過chain攔截器共享數(shù)據(jù)。如果請求由Action x 鏈到Action y,如果這時y需要獲得x的數(shù)據(jù),我們就需要為Action y添加chain攔截器。

6.多模塊支持解決方案。WebWork 提供了很靈活的多模塊解決方案,這樣我們可以很好的組織復(fù)雜的 Web 應(yīng)用項目。

1.)可以在 xwork.XML 文件中,用 include 標(biāo)簽包含另外的一個 xwork 配置文件。例如:

2.) xwork.xml 配置文件支持 package。我們可以將一個業(yè)務(wù)模塊的定義方到一個 package , package 支持繼承功能,子 package 可以享有父 package 的所有定義。

3.)可以為 package 定義一個命名空間。不同的命名空間可以定義相同的 action 名字。命名空間會用于訪問 action 的 URL ,基于這個命名空間,我們可以實現(xiàn)資源權(quán)限的訪問控制。

7.doInput 方法。這是我們常用的小技巧,有時候請求的就是一個頁面模板,總不能為這個單獨寫一個 Action 類吧,這時我們就可以用 ActionSupport 的 doInput 方法,直接返回在 Actoion 中定義為“ input ”的 result。

8.prepare方法。如果在Action執(zhí)行之前,必須要初始化一些數(shù)據(jù)。我們可以將這些初始化的代碼方到prepare方法中。這時,Action類要實現(xiàn)接口com.opensymphony.xwork.Preparable,同時這個Action的定義還需要PrepareInterceptor攔截器的支持。

9.Action的Model Driven。我們大部分的時候用得都是Action的Field Driven,即直接將Action的字段作為數(shù)據(jù)模型。Model Driven是專門為這個Action指定一個模型對象,這樣有什么好處呢?好處是在表達式語言中少了一個對象名的前綴。

10.Quick Start。這是WebWork2.2.2中非常激動人心的特性。它可以象perl或PHP可以快速看到程序運行結(jié)果。這樣在Web開發(fā)時,可以不用編譯Java源代碼,也不用去做打包和部署,就可以快速看到最新程序的運行結(jié)果,提高開發(fā)效率。我們可以在WebWork源碼解壓包的根目錄,輸入命令:java -jar webwork-2.2.2.jar quickstart:showcase(需要jdk1.5的支持),以Quick Start模式,運行showcase項目。

安裝

如果只是搭建一個WebWork開發(fā)環(huán)境,那將非常簡單:

1.去下載最新的WebWork2.2.2項目。

2.搭建一個Web應(yīng)用(這個不難吧);并拷貝WebWork框架運行需要的所有Jar文件到Web應(yīng)用的WEB-INF\lib中。這些Jar文件,可以在WebWork項目中l(wèi)ib\default目錄找到,即那個目錄里面的所有文件。當(dāng)然,別忘記今天的“主角”,在WebWork根目錄下的webwork-2.2.2.jar文件。

3.在Web.xml文件中配置WebWork的前端控制器FilterDispatcher,也就是一個普通的Servlet Filter(過濾器)而已。不過如果是在實際項目中使用,安裝過程中還是有一些問題需要注意的:

1.關(guān)于前端控制器。

2.關(guān)于Action請求URL的后綴。

3.在 Jsp 頁面中, WebWork 的標(biāo)簽庫不需要在 web.xml 中定義。

4.在Jsp頁面中,默認“altSyntax”是開啟的。

5.如果展現(xiàn)層技術(shù)使用Freemarker(WebWork官方的推薦,也是我個人的推薦),如果在頁面中需要使用標(biāo)簽庫,必須在web.xml中配置JspSupportServlet。

6.還有一些其它的定制,比如:編碼,標(biāo)簽的模板文件等等,都可以在webwork.properties文件中配置。如果在ClassPath中沒有這個文件,WebWork會自動讀取WebWork的Jar包里面的default.properties文件。

發(fā)展前景

這是很多人非常關(guān)心的一個問題。特別是WebWork2.2版本發(fā)布之后,官方宣稱WebWork框架將要和Struts合并。這讓一些WebWork的用戶產(chǎn)生了擔(dān)憂,合并之后,是不是就意味著自己在WebWork這方面技術(shù)和經(jīng)驗的積累都已浪費?已使用或即將使用WebWork的項目是不是就意味著更多的風(fēng)險?

答案是:完全不用擔(dān)心這些。WebWork和Struts的合并,是各取所長,然后誕生出一個更加高效的Web框架。而這個框架用得就是WebWork的優(yōu)秀技術(shù)和Struts的強大社區(qū)。

合并的情況如下:

1.產(chǎn)生一個新的項目Struts Action 2.0 = WebWork2.2 + 一些Struts的功能和特性。

2.WebWork框架將會中止新功能的增加,如果有新的版本發(fā)布都會是Bug的修改。

3.代碼、框架的開發(fā)者、社區(qū)都將移到Struts。

4.合并的目標(biāo)是致力于生產(chǎn)率的提高。

5.Struts不再是一個框架,它是一個社區(qū)。

6.Struts社區(qū)中主要有兩個Web框架。一個是基于Action模型的Struts Action;另一個是基于組件模型的Struts Shale。

WebWork是本人工具箱中最愛的一個J2EE Web框架。本人開發(fā)過單純使用Jsp和JavaServlet的項目;也曾經(jīng)自己開發(fā)過基于MVC的Web框架;在2002年開始使用Struts開發(fā);后來也在項目中分別使用過Tapestry和Spring MVC Web框架;也在當(dāng)今的AJAX潮流中隨波逐流。上面的一些技術(shù)也都非常優(yōu)秀,擅用他們?nèi)魏我粋€都會給您帶來很多生產(chǎn)效率的提高。但我仍然是偏愛WebWork。WebWork的與眾不同,得力集團于它基于對象導(dǎo)航圖語言的強大的數(shù)據(jù)存、取方式,得力于它那解耦的攔截器功能,得力于它那無侵入的架構(gòu)設(shè)計。正是由于它,才讓W(xué)eb編程變得更加的自然、簡單、靈活、高效。

參考資料 >

生活家百科家居網(wǎng)