上周EasyJWeb-1.0m3版本發(fā)布,收到幾封來(lái)信,其中有兩封提到EasyJWeb相對(duì)于struts2這個(gè)web MVC框架有哪些優(yōu)勢(shì)。這兩天在編《EasyJWeb實(shí)用開發(fā)指南》,因此,整理了一下其中的一些內(nèi)容,對(duì)其中的一些關(guān)鍵作了一個(gè)簡(jiǎn)單的比較,希望對(duì)于想了解EasyJWeb及Struts2這兩個(gè)框架的朋友有所幫助。
一、總體概述
1、都是基于java的開源web mvc框架,而且都是基于請(qǐng)求轉(zhuǎn)發(fā)模型的mvc框架,這一點(diǎn)與jsf這種基于組件模型的框架不同。
2、EasyJWeb是在綜合struts1.x、webwork、Tapestry、springmvc、rails等框架發(fā)展而來(lái),是EasyJF開源團(tuán)隊(duì)的一個(gè)項(xiàng)目,開發(fā)成員全部是中國(guó)人;而struts2是在webwork2的基礎(chǔ)上發(fā)展而來(lái),當(dāng)然也參考了很多mvc框架,是apache的一個(gè)開源項(xiàng)目,開發(fā)成員來(lái)自世界各地。
3、EasyJWeb表示層主要推Velocity、CommonTemplate這樣的模板引擎,而Struts2視圖層主要推jsp2。當(dāng)然,兩者都可以表示層切換到其它一些視圖技術(shù),只需要增加相應(yīng)的結(jié)果處理引擎即可。
4、EasyJWeb的文檔、代碼注釋、提示信息等主要以中文為主;而struts2是以英文為主。
5、都是一個(gè)能讓你快速開發(fā)企業(yè)級(jí)java web應(yīng)用的框架。
宏觀的東西不多說(shuō),大的用法大家可以從兩個(gè)框架與JPA+Spring結(jié)合實(shí)現(xiàn)的添刪改查實(shí)例進(jìn)行簡(jiǎn)單的對(duì)比分析。你可以直接通過(guò)下面的鏈接了解更多的內(nèi)容:
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的添刪改查 源碼下載
Easyjweb+Spring2+JPA 實(shí)現(xiàn)一個(gè)基本CRUD應(yīng)用示例 英文版
Struts 2 + Spring 2 + JPA + AJAX
Migrating Struts Apps to Struts 2
二、配置
1、零配置
EasyJWeb與struts2都支持零配置,這里的零配置就是指只需要修改web.xml,而不需要寫任何EasyJWeb或Struts2的配置文件,零配置的情況下需要為框架指明到哪兒去掃描Controller(Action)類。分別如下:
EasyJWeb的web.xml













Struts2的web.xml














2、慣例代替配置
EasyJWeb中大量使用了慣例代替配置的機(jī)制,把應(yīng)用程序按模塊進(jìn)行劃分,慣例代替配置包含頁(yè)面視圖模板的查找,多國(guó)語(yǔ)言屬性文件的查找、依賴注入等,已經(jīng)在很多項(xiàng)目中成功應(yīng)用。struts2也使用了一些慣例代替配置,但不知道能否用于實(shí)際開發(fā)。
3、框架配置文件
兩個(gè)框架都可以有自己的配置文件,通過(guò)配置文件來(lái)提高系統(tǒng)的可維護(hù)性。EasyJWeb的配置文件中可以定義系統(tǒng)中的模塊Module(相當(dāng)于控制器或Action)、頁(yè)面模板視圖Page等MVC框架特有的屬性,另外還可以配置業(yè)務(wù)組件<bean>、攔截器、異常處理器、及依賴注入,配置將要支持遠(yuǎn)程Web調(diào)用服務(wù)的Ajax業(yè)務(wù)組件等;EasyJWeb的配置文件功能更廣,初學(xué)有一點(diǎn)大雜燴的感覺(jué)。
Struts2的配置文件同樣可以用來(lái)配置Action、頁(yè)面導(dǎo)向、攔截器,也可以配置業(yè)務(wù)組件Bean等,這一點(diǎn)跟EasyJWeb非常類似。采用分包及攔截器鏈的方式組織應(yīng)用程序中的各個(gè)部件。
EasyJWeb配置文件中配置Bean




Struts2配置文件中配置Bean

三、控制器Action
兩個(gè)框架的控制器在默認(rèn)情況下都是線程安全的,而且都不依賴于具體的類。EasyJWeb默認(rèn)的處理器實(shí)現(xiàn)要求Actionn必須實(shí)現(xiàn)IWebAction接口,而Struts2可以不需要。如下:
EasyJWeb中的Action







Struts2中的Action






當(dāng)然,這個(gè)祼體Action基本上沒(méi)任何作為,真正的Struts2版本的HelloAction可以寫成如下:












另外,還需要在struts2的配置文件中增加大致如下的配置來(lái)指明這個(gè)success字符對(duì)應(yīng)的文件路徑:



但實(shí)際應(yīng)用中,EasyJWeb的Action大多數(shù)都直接繼承AbstractPageCmdAction,因?yàn)檫@個(gè)基礎(chǔ)控制器提供了很多非常強(qiáng)大的功能,比如按慣例查找頁(yè)面、靈活頁(yè)面跳轉(zhuǎn)及視圖切換,動(dòng)態(tài)特性的命令方法。同樣為了使用Struts2中的很多功能,比如攔截器、依賴注入等都需要Action實(shí)現(xiàn)指定的接口,更多的時(shí)候直接繼承ActionSuport類。
也就是說(shuō),一個(gè)半祼或全祼的Action在實(shí)際應(yīng)用中很少用到。
四、依賴注入
兩個(gè)框架都實(shí)現(xiàn)了依賴注入,都能自動(dòng)往Action中自動(dòng)注入所需要的業(yè)務(wù)組件。EasyJWeb的依賴注入直接依靠他內(nèi)置的IoC容器,而Struts2的依賴注入依靠攔截器ActionAutowiringInterceptor進(jìn)行注入。EasyJWeb的依賴注入是真正實(shí)現(xiàn)不要任何配置就能自動(dòng)注入應(yīng)用程序中各層(業(yè)務(wù)層、持久層等)中用到的業(yè)務(wù)組件的,你可以通過(guò)這個(gè)簡(jiǎn)單的添刪改查實(shí)例來(lái)看見(jiàn)效果。
兩者都可以直接借助第三方的IoC容器如Spring。下面是在EasyJWeb中使用Spring容器,需要在EasyJWeb的配置文件中加入下面的配置:
















Struts2可以使用代理的方式,先在web.xml文件中通過(guò)下面的配置啟動(dòng)spring容器:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
然后在struts的配置文件使用指定struts.objectFactory為spring即可。
<constant name="struts.objectFactory" value="spring" />
另外一點(diǎn)區(qū)別是,EasyJWeb的Action都是由EasyJWeb的IoC容器管理,不需要用其它容器來(lái)管理,因?yàn)镋asyJWeb的IoC容器會(huì)把其它容器中的業(yè)務(wù)組件注入到Action的相應(yīng)屬性中,你可以把業(yè)務(wù)組件同時(shí)放在EJB容器、Spring容器、或者Guice容器中。
關(guān)于如何在EasyJWeb中使用Guice容器,請(qǐng)參考>>
五、數(shù)據(jù)的處理
兩個(gè)框架都拋棄了Struts1.x中那種需要借助ActionFrom來(lái)處理數(shù)據(jù)的機(jī)制,而采用更為先進(jìn)的注入方式。EasyJWeb中的WebForm中提供了一個(gè)toPo方法,用來(lái)處理數(shù)據(jù)注入。
比如,為了在Action中注入Person對(duì)象:
EasyJWeb的Action代碼中直接使用toPo方法手動(dòng)注入,如:













對(duì)應(yīng)的表單是普通的html表示,如下所示:





Struts2中則不需要寫代碼,只需要把要注入的數(shù)據(jù)在Action中準(zhǔn)備好即可,如:


























對(duì)應(yīng)的表單如下所示:





當(dāng)然,Struts2關(guān)于數(shù)據(jù)轉(zhuǎn)換方面提供了很多可供選擇,比如也可以實(shí)現(xiàn)ModelDriven接口提供getModel來(lái)按指定的規(guī)則注入模型數(shù)據(jù)。
對(duì)于關(guān)聯(lián)對(duì)像的加載及注入,比如Person中的Department屬性,EasyJWeb只需要在屬性上加上一個(gè)@POLoad標(biāo)簽即可,而struts2則不能。
六、其它
1、驗(yàn)證處理
EasyJWeb提供了一個(gè)基于注解標(biāo)簽實(shí)現(xiàn)的靈活框架,可以直接在要驗(yàn)證的數(shù)據(jù)對(duì)象(一般是模型對(duì)象)中直接添加驗(yàn)證標(biāo)簽來(lái)實(shí)現(xiàn)驗(yàn)證,另外在Action中加入自定義的驗(yàn)證內(nèi)容也非常容易,只需要使用addError方法即可。當(dāng)前EasyJWeb-1.0m3只支持通過(guò)注解的方式驗(yàn)證。
Struts2的驗(yàn)證框架結(jié)合了Strut1.x及webwork,可以直接使用驗(yàn)證標(biāo)簽來(lái)標(biāo)注驗(yàn)證,也可以使用xml文件來(lái)配置驗(yàn)證規(guī)則及驗(yàn)證目標(biāo)對(duì)象。
EasyJWeb的驗(yàn)證標(biāo)簽:
@Validator(name=”string”,value=”blank;trim;required;min:5;max:10;minMsg:最少不能少于5個(gè)字符;maxMsg:最大不能超過(guò)10字符”)
更多參考:http://www.easyjf.org/html/20070822/12867758-1954570.htm
Struts2的驗(yàn)證配置,








更多參考:http://struts.apache.org/2.x/docs/validation.html
2、ajax支持 Struts2提供對(duì)dojo的全面支持及封裝,提供了一套富組件的支持,并且可以在自定義標(biāo)簽中指定form以ajax方式提交表單等,功能較為完善。
EasyJWeb則提供了一個(gè)類似DWR框架的Ajax實(shí)現(xiàn),可以用于直接把業(yè)務(wù)層對(duì)象發(fā)布到客戶端通過(guò)json調(diào)用,對(duì)于Ajax提交及頁(yè)面部分刷新等則直接在頁(yè)面中調(diào)用EasyAjaxUtil這個(gè)實(shí)用工具中的ajaxSubmit、loadPage等方法實(shí)現(xiàn)。相對(duì)來(lái)說(shuō)EasyJWeb的Ajax支持還有待進(jìn)一步完善。
3、開發(fā)效率
EasyJWeb的目標(biāo)在于提高開發(fā)效率,整個(gè)項(xiàng)目除了核心MVC部分以外,在easyjweb-ext-xx.jar包中還提供了一些通用業(yè)務(wù)邏輯,如Crud應(yīng)用、添刪改查、基于JPA+Spring2的泛型DAO支持、分頁(yè)處理引擎等,可以在程序中直接使用;另外在easyjweb-generator-xx.jar包中提供了基于模板的代碼生成引擎,可以快速生成基于EJS(EasyJWeb+JPA+Spring2)的Crud應(yīng)用。
Struts2有著眾多的第三方支持,官方網(wǎng)站上提供了一些應(yīng)用骨架可以直接使用,另外還可以使用AppFuse等這個(gè)第三方框架生成基于Struts2的應(yīng)用。
4、文檔
Struts2的文檔非常全,也比較系統(tǒng),關(guān)于struts2的書也可以在市場(chǎng)上買到,但EasyJWeb在這方面由于參與貢獻(xiàn)的人少,因此文檔及教程相對(duì)來(lái)說(shuō)就如很多網(wǎng)友說(shuō)的:“還存在很多問(wèn)題”,這里也邀請(qǐng)廣大的國(guó)內(nèi)開源愛(ài)好者一起來(lái)參與完善EasyJWeb的文檔完善。
另外,EasyJWeb及Struts2都還具有其它自己很多獨(dú)特的優(yōu)點(diǎn)。總的來(lái)說(shuō),對(duì)于框架的選擇應(yīng)該是多方面考慮的,沒(méi)有絕對(duì)的誰(shuí)好或者誰(shuí)壞,更應(yīng)該是順手適用才行,如果你愿意,繼續(xù)使用Struts1.x兩三年也沒(méi)問(wèn)題。由于本人對(duì)Struts2應(yīng)用得不夠多,所以文中一些不足或偏頗之處,還請(qǐng)各位朋友不吝賜教。
by EasyJF開源 大峽