一什麼是Struts?
雖然Struts號稱是一個全新的框架但這僅僅是相對Struts 而言Struts 與Struts 相比確實有很多革命性的改進但它並不是新發布的新框架而是在另一個赫赫有名的框架WebWork基礎上發展起來的從某種程度上來講Struts沒有繼承Struts 的血統而是繼承WebWork的血統或者說WebWork衍生出了Struts而不是Struts 衍生了Struts因為Struts是WebWork的升級而不是一個全新的框架因此穩定性性能等各方面都有很好的保證而且吸收了Struts 和WebWork兩者的優勢因此是一個非常值得期待的框架
Apache Struts是一個優雅的可擴展的JAVA EE web框架框架設計的目標貫穿整個開發周期從開發到發布包括維護的整個過程
Apache Struts 即是之前大家所熟知的WebWork 在經歷了幾年的各自發展後WebWork和Struts社區決定合二為一也即是Struts
Struts和Struts的不同
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一起使用
Struts的工作流程圖
工作流程圖
工作流程當接收到一個httprequest Interceptor做一些攔截或者初始的工作當外部的httpservletrequest到來時初始到了servlet容器 傳遞給一個標准的過濾器鏈ActionContextCleanUp這個在集成插件方面非常有用Other filters(SitMeshetc)
調用FilterDispatecher會去查找相應的ActionMapper如果找到了相應的ActionMapper它將會將控制權限交給ActionProxy ActionProxy將會通過ConfigurationManager來查找配置strutsxml下一步將會 通過ActionInvocation來負責命令模式的實現(包括調用一些攔截Interceptor框架在調用action之前)
一旦action返回會查找相應的Result Result類型可以是 jsp或者freeMark 等這些組件和ActionMapper一起返回給請求的url(注意攔截器的執行順序)
響應的返回是通過我們在webxml中配置的過濾器如果ActionContextCleanUp是當前使用的則FilterDispatecher將不會清理sreadlocal ActionContext如果ActionContextCleanUp不使用則將會去清理sreadlocals
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28090.html