當前位置:名人名言大全網 - 傷感說說 - struts是什麽,說說它的工作機制,他的優點是什麽?

struts是什麽,說說它的工作機制,他的優點是什麽?

壹.Struts2怎麽處理壹個用戶請求的?

1,首先用戶發出壹個請求,通過filterDispatcher攔截器攔截下來。

2, filterDispatcher會詢問ActionMapper來決定這個請求是否需要調用某個Action。

3, 這個ActionMapper封裝了請求的信息。如果ActionMapper決定需要調用某個Action,FilterDispatcher會按信息(action的名字,調用的方法名)創建壹個Action的代理對象。實際上對Action的調用就是通過這個代理對象來實現的。

4,把請求交給這個代理,如果用戶提交的請求沒有指定方法,那麽Struts2則默認excute方法。這個代理會創建壹個調度器的實例。

這個調度器裏面定義了壹個invoke方法,這個方法就實現了攔截器的交互和執行Action裏的excute方法。

5, 攔截器是以value棧的形式調用。

Struts2默認的有18個攔截器。第壹個攔截器是壹個異常攔截器,這樣的話,我第壹個攔截器把異常捕獲到,那麽以後就不用捕獲其他攔截器出現的異常了。

6, 當Action執行完以後,調度器就會負責根據struts.xml中的配置找到對應的返回結果。

7, 然後調度器就返回所有的攔截器,通過response把結果集返回給客戶。

二,Struts2和Struts1的不同

Action 類:

Struts1要求Action類繼承壹個抽象基類。Struts1的壹個普遍問題是使用抽象類編程而不是接口。

Struts 2 Action類可以實現壹個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供壹個ActionSupport基類去實現 常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。

 線程模式:

Struts1 Action是單例模式並且必須是線程安全的,因為僅有Action的壹個實例來處理所有的請求。單例策略限制了Struts1 Action能做的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。

 Struts2 Action對象為每壹個請求產生壹個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,並且不會導致性能和垃圾回收問題)

 Servlet 依賴:

Struts1 Action 依賴於Servlet API ,因為當壹個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。

 Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。

 可測性:

測試Struts1 Action的壹個主要問題是execute方法暴露了servlet API(這使得測試要依賴於容器)。壹個第三方擴展--Struts TestCase--提供了壹套Struts1的模擬對象(來進行測試)。

 Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴註入”支持也使測試更容易。

捕獲輸入:

Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承壹個基類。因為其他JavaBean不能用作ActionForm,開發者經常創建多余的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗余的javabean)。

  Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種ModelDriven 特性簡化了taglib對POJO輸入對象的引用。

 表達式語言:

Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。

Struts2可以使用JSTL,但是也支持壹個更強大和靈活的表達式語言--”Object Graph Notation Language” (OGNL).

綁定值到頁面(view):

Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。

Struts 2 使用 “ValueStack”技術,使taglib能夠訪問值而不需要把妳的頁面(view)和對象綁定起來。ValueStack策略允許通過壹系列名稱相同但類型不同的屬性重用頁面(view)。

 類型轉換:

Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類壹個轉換器,對每壹個實例來說是不可配置的。

 Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。

校驗:

Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同壹個類可以有不同的校驗內容,但不能校驗子對象。

 Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性

 Action執行的控制:

Struts1支持每壹個模塊有單獨的Request Processors(生命周期),但是模塊中的所有Action必須***享相同的生命周期。

Struts2支持通過攔截器堆棧(Interceptor Stacks)為每壹個Action創建不同的生命周期。堆棧能夠根據需要和不同的Action壹起使用。

三,Struts2框架按如下搜索順序加載Struts2常量:

struts-default.xml 保存在struts2-core-版本.jar

struts-plugin.xml 保存在struts2-Xxx-版本.jar

struts.xml web應用默認的Struts2配置文件

struts.properties web應用默認的Struts2配置文件

web.xml web應用的配置文件

如果在多個文件配置了同壹個Struts2常量,則後壹個文件中配置的常量值會覆蓋前面文件中配置的常量。

四,struts2遇到類型轉換錯誤的時候,struts2自動生成壹條錯誤信息,並且自動將這條錯誤信息放到addFieldError裏面

五, 在這裏,或許有些讀者會提出問題來,為什麽好好的Servlet對象要在這裏被封裝成Map對象呢?我想原因可能有以下兩個:

1. 對Struts2的Action徹底屏蔽Servlet容器,從而無需再使用底層Servlet API進行編程。妳所面對的,將永遠是壹個又壹個的Java對象。

2. 便於各種View技術,例如JSP,Freemarker,Velocity等對ValueStack中上下文環境,尤其是Servlet對象中的數據進行讀取。試想,如果在這裏不將HttpServletRequest,HttpSession等Servlet對象轉化成Map,那麽我們將很難通過OGNL表達式,對這些Servlet對象中的值進行讀取。

六,驗證validate 先執行validateMethod方法 再執行validate方法 execute方法 validateExecute()

七,字段校驗(常用)和非字段校驗

客戶端的校驗:1.form的主題(theme)壹定不能設定為simple

2,將form的validate屬性設置為true

最好不要使用struts2給我們提供的客戶端校驗方法

八,fieldError

1,真正存放在field級別錯誤的信息對象是LinkdedHashMp

2,該LinkedHashMap的key是String類型的,value是ArrayList類型的

3,對於Action級別的錯誤信息,實際上是放置在ArrayList中的

九,攔截器 攔截器棧

我們可以把struts2想象成壹個容器,配置了許多攔截器,然後壹層壹層地調用

<interceptor-ref></interceptor-ref>

<interceptor-ref name=”defaultStack”></interceptor-ref>

先配的攔截器先執行,先配置的後出來(進門出門)

<include>優先級高於<exclude>

十,模型驅動

paramsPrepareParamsStack在Struts 2.0中是壹個很奇妙的interceptor stack,以至於很多人疑問為何不將其設置為默認的interceptor stack。paramsPrepareParamsStack主要解決了ModelDriven和Preparable的配合問題,從字面上理解來說,這個stack的攔截器調用的順序為:首先params,然後prepare,接下來modelDriven,最後再params。Struts 2.0的設計上要求modelDriven在params之前調用,而業務中prepare要負責準備model,準備model又需要參數,這就需要在 prepare之前運行params攔截器設置相關參數,這個也就是創建paramsPrepareParamsStack的原因。流程如下:

1. params攔截器首先給action中的相關參數賦值,如id

2. prepare攔截器執行prepare方法,prepare方法中會根據參數,如id,去調用業務邏輯,設置model對象

3. modelDriven攔截器將model對象壓入value stack,這裏的model對象就是在prepare中創建的

4. params攔截器再將參數賦值給model對象

5. action的業務邏輯執行 依據此stack

十壹,sturts2與Servlet耦合部分

(1)ActonContext.getContext() (將request,session等轉化為map,方便測試,但是沒有httpresponse的接口)

(2)ServletResponseAware,ServletRequestAware接口分別實現setServletResponse()方法,servletResquest()方法

Struts2框架自動將與容器相關的request對象自動set到應用裏面去,這是壹個典型的IOC

(3)ServletActionContext 直接靜態方法調用,即可拿到request等對象

建議使用第壹種,因為雖然與servlet耦合,但是並沒有真正出現servletAPI,整個action還是很幹凈的,如果想使用httpresponse,那麽可以使用第三種方式。