Action類
Struts 1要求Action類要擴展自一個抽象基類。Struts 1的一個共有的問題是面向抽象類編程而不是面向接口編程。
Struts 2的Action類實現(xiàn)了一個Action接口,連同其他接口一起實現(xiàn)可選擇和自定義的服務。Struts 2提供一個名叫ActionSupport的基類實現(xiàn)一般使用的接口。雖然,Action接口不是必須的。任何使用execute方法的POJO對象可以被當作Struts 2的Action對象使用。
程模型
Struts 1 Action類是單例類,因只有一個示例控制所有的請求。單例類策略造成了一定的限制且給開發(fā)帶來了額外的煩惱。Action資源必須是程安全或者同步的。
Struts 2 Action對象每一個請求都實例化對象,所以沒有程安全的問題。(實踐中,servlet容器生許多丟的對象對于每一個請求,多于一個的對象并不影響垃圾收集)
Servlet 依賴
Struts 1的Action類依賴于servlet API以HttpServletRequest和HttpServletResponse作參數(shù)傳給execute方法當Action被調用時。
Struts 2的Action不和容器有關。Servlet上下文被表現(xiàn)簡單的Maps,允許Action被獨立的測試。Struts 2的Action可以訪問最初的請求和相應,如果需要的話。然而,其他的架構元素少或者排除直接訪問HttpServletRequest或者HttpServletResponse的需要。
易測性
測試Struts 1的主要障礙是execute方法暴露了Servlet API。第三方的擴展,Struts測試用例,提供Struts 1的集合對象。
Struts 2的Action可以通過實例化Action測試,設置屬性,然后調用方法。依賴注入的支持也是測試變得更簡單。
接受輸入
Struts 1使用ActionForm對象捕獲輸入。象Action一樣,所有的ActionForm必須擴展基類。因其他的JavaBean不能作ActionForm使用,開發(fā)者經(jīng)常創(chuàng)建多余的類捕獲輸入。DynaBeans可以被用來作替代ActionForm的類創(chuàng)建。但是開發(fā)者可以重新描述已經(jīng)存在的JavaBean。
Struts 2 Action屬性作輸入屬性,排除第二個輸入對象的需要。輸入屬性可能有豐富的對象類型這些類型有他們自己的屬性。Action的屬性可以通過標簽庫訪問。Struts 2也支持ActionForm形式。豐富的對象類型,包含業(yè)務或者域對象,可以被當作輸入或者輸出對象使用。饃型驅動特性簡化標簽對POJO輸入對象的引用。
表達式語言
Struts 1整和JSTL,所以它使用JSTL的表達式語言。表達式語言有基本的圖形對象移動,但是相對很弱的集合和被索引的屬性支持。
Struts 2使用JSTL,但是框架也支持更大和更靈活的表達式,叫做“對象圖形符號語言”(OGNL)。
將值綁定要視圖上
Struts 1使用標準JSP機制來綁定對象到頁面上下文。
Struts 2使用“ValueStack”技術了標簽庫可以不用鏈接你的視圖到對象的表現(xiàn)類型訪問值。ValueStack策略允許重用視圖。
類型轉換
Struts 1的ActionForm屬性經(jīng)常都是String的。Struts 1使用Commons-Beanutils類型轉換。轉換每一個類,不是每一個實例配置。
Struts 2使用OGNL類型轉換??蚣馨D換器基本的和共同的對象類型和原始類型。
驗證
Struts 1支持手動驗證憑借ActionForm的validate方法,或者通過擴展的公用驗證器。類可以有不同的驗證上下文未相同的類,但是不能不能包括驗證子對象。
Struts 2支持手動驗證憑借validate方法和XWork驗證框架。Xwork驗證框架支持一連串的驗證子屬性使用的驗證了屬性類的類型和嚴正上下文而定義。
Action執(zhí)行的控制
Struts 1支持獨立的請求處理器對于每一個模型,但是所有在模型中的Action必須共享同一個生命周期。
Struts 2支持在每一個Action基礎上憑借攔截棧創(chuàng)建不同的生命周期。自定義棧可以被創(chuàng)建且使用不同的所需 的Action