看看別人的總結(jié):前4個(gè)缺點(diǎn)是致命的,
Action
類
|
在
Struts
里面,每一個(gè)
Action
類必需要繼承一個(gè)抽象的類
org.apache.struts.action.Action
。這個(gè)在
Java
編程中會(huì)引來一些問題,就是關(guān)于多種繼承的問題。
|
WebWork
的
Action
類僅需要實(shí)現(xiàn)接口
com.opensymphony.xwork.Action
,也可以實(shí)現(xiàn)其它的接口來實(shí)現(xiàn)更多的功能,譬如:
validate
(驗(yàn)證),
localware(
國(guó)際化
)
等。當(dāng)然,它也提供了一個(gè)類
ActionSupport
集成了上面的所有功能,我們?cè)陂_發(fā)中可以根據(jù)需要選擇。
|
線程模型
|
Struts
的
Action
必需是
thread
-
safe
方式,它僅僅允許一個(gè)實(shí)例去處理所有的請(qǐng)求。所以
action
用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問題。
|
在
WebWork
中,每個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)
Action
,因此沒有線程的安全問題。實(shí)際上
Servlet
容器對(duì)每個(gè)請(qǐng)求也產(chǎn)生多個(gè)對(duì)象,它也沒有證明對(duì)性能和垃圾回收產(chǎn)生太多的影響。
|
Servlet
的依賴
|
Struts
處理
Action
時(shí)必需要依賴
ServletRequest
和
ServletResponse
,所有它擺脫不了
Servlet
容器。
|
WebWork
的
Action
不用依賴
Web
層和其它的容器。它可以通過
ActionContext
,直接去訪問
Request
和
Response
,但這個(gè)是可選的,只有在必需的請(qǐng)求下使用。
|
測(cè)試
|
Struts
的每個(gè)
Action
都同
Web
層耦合在一起,這樣它的測(cè)試依賴于
Web
容器,單元測(cè)試也很難實(shí)現(xiàn)。不過有一個(gè)
Junit
的擴(kuò)展工具
Struts TestCase
可以實(shí)現(xiàn)它的單元測(cè)試。
|
Webwork
的
action
能夠通過賦予一定的屬性,就可以執(zhí)行單元測(cè)試。同時(shí)也可以使用一個(gè)
mock
的實(shí)例去測(cè)試,而不是通過啟動(dòng)
web
容器來進(jìn)行測(cè)試。
|
FormBean
|
Struts
要求有
FormBean
對(duì)應(yīng)每一個(gè)表單,而且
FormBean
必需繼承抽象類
ActionForm
。而使用
DynaBeans
實(shí)際上沒有太大的意義。不能夠很好的處理現(xiàn)有的模型。
|
Webwork
能夠動(dòng)態(tài)的收集
web
的數(shù)據(jù)然后再賦值給
bean
。它也可以使用
FormBean
的形式,
FormBean
可以是普通的
DTO
和域?qū)ο螅挥弥匦赂鶕?jù)域?qū)ο髞砩尚碌?/span>
FormBean
,也不需繼承抽象類
ActionForm
。
|
前端表達(dá)式語言
|
Struts
集成了
JSTL
,所以它主要使用
JSTL
的表達(dá)式語言來獲取數(shù)據(jù)。可是
JSTL
的表達(dá)式語言在
Collection
和索引屬性方面處理顯得很弱。
|
WebWork
的表達(dá)式語言使用了功能強(qiáng)大的
OGNL
。它使用
OGNL
建立一個(gè)
OgnlValueStack
來搜索數(shù)據(jù)。
Webwork
前端也可以使用
JSTL
,但它同時(shí)支持:
velocity
、
freemaker
、
jspparer
、
xml
。
|
類型的轉(zhuǎn)換
|
Struts
的
FormBean
把所有的數(shù)據(jù)都作為
String
類型,它可以使用工具
Commons-Beanutils
進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在
Class
級(jí)別,而且轉(zhuǎn)化的類型是不可配置的。類型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶也是非常困難的。
|
WebWork
使用
OGNL
進(jìn)行類型轉(zhuǎn)化,提供了所有基本類型的轉(zhuǎn)化功能。類型轉(zhuǎn)化可以直接對(duì)一個(gè)
Class
進(jìn)行(
Class
級(jí)別)轉(zhuǎn)化,也可以對(duì)
Class
的字段進(jìn)行類型轉(zhuǎn)化。它使用攔截器可以很容易的將類型轉(zhuǎn)化的錯(cuò)誤信息返回給用戶,而且錯(cuò)誤信息可以對(duì)應(yīng)到一個(gè)相應(yīng)的字段。
|
對(duì)
Action
執(zhí)行前和后的處理
|
Struts
處理
Action
的時(shí)候是基于
class
的
hierarchies
,很難在
action
處理前和后進(jìn)行操作。
|
Webwork2
允許您處理
Action
可以通過攔截器,就是在每一個(gè)
Action
處理前或者后進(jìn)行其它操作。它的攔截器可以在配置文件中動(dòng)態(tài)添加,這樣
Action
和攔截器之間完全解藕,更好的實(shí)現(xiàn)了組件化。
|
驗(yàn)證處理
|
Struts
的驗(yàn)證是調(diào)用
FormBean
的
validator()
方法,其實(shí)就是對(duì)
FormBean
的驗(yàn)證。它一般使用框架
Commons Validation
進(jìn)行數(shù)據(jù)驗(yàn)證處理。它使用了一個(gè)全局的配置文件
validation.xml
定義了
FormBean
的驗(yàn)證信息。
Struts
的
FormBean
屬性都被認(rèn)為是
String
類型,所以它在驗(yàn)證時(shí)也需要額外的類型轉(zhuǎn)化。
|
WebWork
使用
Xwork
的驗(yàn)證框架進(jìn)行驗(yàn)證處理,它可以通過配置攔截器來激活。它可以為每個(gè)需要驗(yàn)證的
Class
指定一個(gè)
xml
驗(yàn)證文件,也可以為一個(gè)
Class
在不同的情況指定不同的
xml
驗(yàn)證文件。
WebWork
證可以給每個(gè)
Action
類指定對(duì)應(yīng)的驗(yàn)證文件,也可以給
Action
的字段去指定驗(yàn)證文件。通過攔截器來組裝
Action
和其驗(yàn)證文件,使它們之間完全解藕。
|
對(duì)
Action
執(zhí)行的控制
|
Struts
創(chuàng)建一個(gè)
Action
,如果想控制它的執(zhí)行順序?qū)?huì)非常困難。甚至你要重新去寫
Servlet
來實(shí)現(xiàn)你的這個(gè)功能需求。
|
在這個(gè)方面,
WebWork
的攔截器棧提供了強(qiáng)大的功能。
Action
的所有切面功能都有攔截器來實(shí)現(xiàn)(比如:取得
request
請(qǐng)求參數(shù)、驗(yàn)證處理等),這樣你就可以用攔截器棧來組織攔截器的執(zhí)行順序。例如:你需要在使用
request
請(qǐng)求參數(shù)來設(shè)置
Action
屬性之前,使用
IoC
框架設(shè)置
Action
的屬性,反之已然。這時(shí),你就可以為
package
或
Action
指定一個(gè)攔截器棧來實(shí)現(xiàn)。
|
?
?
?
下面是我在研究
WebWork
時(shí),使用的資源和研究過的項(xiàng)目,希望能對(duì)你能有幫助。
1、?
當(dāng)然就是
WebWork
的官方網(wǎng)站:
http://www.opensymphony.com/webwork/
里面有最新的
WebWork
文檔和它的一個(gè)
wiki
2、?
一本好書:
Java Open Source Programming : with XDoclet, JUnit, WebWork, Hibernate
,里面有很好的
WebWork
教程。它附帶的源代碼可以去
http://www.amazon.com/
下載,里面的
petsoar
是一個(gè)非常好的
WebWork
開源項(xiàng)目。
3、?
Confluence
(
http://www.atlassian.com/software/confluence
)是專業(yè)的
J2EE wiki,
用于知識(shí)管理和項(xiàng)目組交流。它使用的架構(gòu)是
webwork2+Spring+Hibernate
。
Confluence
雖是商業(yè)軟件,不過對(duì)于
OpenSource
的項(xiàng)目它全部免費(fèi)提供。它的架構(gòu)思想很值得我們?nèi)W(xué)習(xí)。
4、?
OpenReports(http://www.opensourcesoft.net)
是一個(gè)開源的項(xiàng)目,基于
Web
的報(bào)表系統(tǒng)。它用到的技術(shù)有:
WebWork 2.0
、
Velocity
和
Hibernate
。
http://www.opensymphony.com/
?