Action 類
; Struts要求Action類繼承一個抽象基類Struts的一個普遍問題是使用抽象類編程而不是接口
; Struts Action類可以實現一個Action接口也可實現其他接口使可選和定制的服務成為可能Struts提供一個ActionSupport基類去實現 常用的接口Action接口不是必須的任何有execute標識的POJO對象都可以用作Struts的Action對象
線程模式
; Struts Action是單例模式並且必須是線程安全的因為僅有Action的一個實例來處理所有的請求單例策略限制了Struts Action能作的事並且要在開發時特別小心Action資源必須是線程安全的或同步的
; Struts Action對象為每一個請求產生一個實例因此沒有線程安全問題(實際上servlet容器給每個請求產生許多可丟棄的對象並且不會導致性能和垃圾回收問題)
Servlet 依賴
; Struts Action 依賴於Servlet API 因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法
; Struts Action不依賴於容器允許Action脫離容器單獨被測試如果需要Struts Action仍然可以訪問初始的request和response但是其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性
可測性
; 測試Struts Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴於容器)一個第三方擴展——Struts TestCase——提供了一套Struts的模擬對象(來進行測試)
; Struts Action可以通過初始化設置屬性調用方法來測試依賴注入支持也使測試更容易
捕獲輸入
; Struts 使用ActionForm對象捕獲輸入所有的ActionForm必須繼承一個基類因為其他JavaBean不能用作ActionForm開發者經常創建多余的類捕獲輸入動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇但是開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗余的javabean)
; Struts 直接使用Action屬性作為輸入屬性消除了對第二個輸入對象的需求輸入屬性可能是有自己(子)屬性的rich對象類型Action屬性能夠通過web頁面上的taglibs訪問Struts也支持ActionForm模式rich對象類型包括業務對象能夠用作輸入/輸出對象這種ModelDriven 特性簡化了taglib對POJO輸入對象的引用
表達式語言
; Struts 整合了JSTL因此使用JSTL EL這種EL有基本對象圖遍歷但是對集合和索引屬性的支持很弱
; Struts可以使用JSTL但是也支持一個更強大和靈活的表達式語言——Object Graph Notation Language (OGNL)
綁定值到頁面(view)
; Struts 使用標准JSP機制把對象綁定到頁面中來訪問
; Struts 使用 ValueStack技術使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)
類型轉換
; Struts ActionForm 屬性通常都是String類型Struts使用CommonsBeanutils進行類型轉換每個類一個轉換器對每一個實例來說是不可配置的
; Struts 使用OGNL進行類型轉換提供基本和常用對象的轉換器
校驗
; Struts 支持在ActionForm的validate方法中手動校驗或者通過Commons Validator的擴展來校驗同一個類可以有不同的校驗內容但不能校驗子對象
; Struts支持通過validate方法和XWork校驗框架來進行校驗XWork校驗框架使用為屬性類類型定義的校驗和內容校驗來支持chain校驗子屬性
Action執行的控制
; Struts支持每一個模塊有單獨的Request Processors(生命周期)但是模塊中的所有Action必須共享相同的生命周期
; Struts支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創建不同的生命周期堆棧能夠根據需要和不同的Action一起使用
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28549.html