struts2不是struts1的升級(jí),而是繼承的webwork的血統(tǒng),它吸收了struts1和webwork的優(yōu)勢(shì)。
Struts1和Struts2的區(qū)別和對(duì)比:
1、Servlet依賴(lài)性由于Action在被調(diào)用的時(shí)候,HttpServletRequest和HttpServletResponse被傳遞到execute()方法,struts1的Action對(duì)Servlet API有依賴(lài) 性,但如果在struts2中,Action就不會(huì)對(duì)容器有依賴(lài)性了,因?yàn)閟truts2的Action是由簡(jiǎn)單的POJO組成,在struts2中,Servlet上下文以簡(jiǎn)單的Map的形式表現(xiàn)出來(lái),這使得Action可以得到獨(dú)立的測(cè)試,如果需要,struts2也可以訪問(wèn)原始的請(qǐng)求與響應(yīng)。
2、 Action類(lèi)struts1要求action類(lèi)繼承一個(gè)基類(lèi),struts2 Action要求繼承ActionSupport基類(lèi)
3、驗(yàn)證struts1和struts2都支持通過(guò)validate方法的手動(dòng)驗(yàn)證,struts1使用ActionForm中的validate方法,而struts2支持通過(guò)Validate方法和Xwork校驗(yàn)框架的手動(dòng)驗(yàn)證
4、線程struts1是單例模式的并且必須是線程安全的,因?yàn)閮H有一個(gè)Action的實(shí)例來(lái)處理所有請(qǐng)求,而struts2為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例
5、易測(cè)性struts1一個(gè)主要問(wèn)題是execute方法暴露了Servlet API,一個(gè)叫Struts TestCase的第三方擴(kuò)展,提供了一個(gè)struts1測(cè)試用的模擬對(duì)象,但是struts2中,Action可以經(jīng)由創(chuàng)建Action實(shí)例,設(shè)置屬性,和調(diào)用方法來(lái)得到測(cè)試
6、獲取輸出struts1使用ActionForm來(lái)捕獲輸入,而所有的ActionForm需要繼承一個(gè)框架依賴(lài)的基類(lèi),由于javabean不能當(dāng)作ActionForm來(lái)用,開(kāi)發(fā)人員不得不創(chuàng)建冗繁的類(lèi)來(lái)獲取出入,不過(guò)struts2用Action屬性,這避免了需要?jiǎng)?chuàng)建第二個(gè)輸入對(duì)象
7、表達(dá)式語(yǔ)音struts1與JSTL整合,struts2不僅支持jstl 還支持OGNL
8、將綁定值到視圖中在視圖層,struts1使用標(biāo)準(zhǔn)的JSP來(lái)綁定對(duì)象到頁(yè)面上下文來(lái)訪問(wèn),然而struts2使用一種叫值棧的技術(shù),這使得標(biāo)簽可以訪問(wèn)值而不需將視圖與正在呈遞的對(duì)象類(lèi)型連接起來(lái),值棧允許重用一些屬性名相同但類(lèi)型不同的視圖類(lèi)型
9、類(lèi)型轉(zhuǎn)換通常struts1的ActionForm屬性都是string類(lèi)型的,struts1使用Commons-Beanutils進(jìn)行類(lèi)型轉(zhuǎn)換,這些針對(duì)每一個(gè)類(lèi)的類(lèi)型轉(zhuǎn)換無(wú)法為每一個(gè)實(shí)例配置,然而struts2使用OGNL來(lái)進(jìn)行類(lèi)型轉(zhuǎn)換,框架包含了針對(duì)基礎(chǔ)類(lèi)型,常見(jiàn)對(duì)象類(lèi)型與原始類(lèi)型的轉(zhuǎn)換器
10、Action執(zhí)行控制struts1支持每一個(gè)模塊的請(qǐng)求處理器的分離,但是同一模塊下的所有Action必須共享相同的生命周期,struts2支持通過(guò)攔截器棧為每一個(gè)Action創(chuàng)建不同的生命周期,自定義棧可以視需要對(duì)不同的Action使用