struts2學習筆記

對於只需在本Action內有效的Forward,應在Action元素內配置局部Forward.
能過ActionForm可以使Action無須從HTTP請求中解析參數,由於全部的參數都被封裝在ActionForm中。
ActionServlet攔截到用戶的請求後,根據用戶的請求,在配置文件中查找對應的Action,Action的name
屬性指定了用於封裝請求參數的ActionForm;而後ActionServlet將建立默認的ActionForm實例,並調用對應的setter方法完成ActionForm的初始化。
局部Forward做爲Action的子元素配置,全局Forward配置在blobal-forwards元素裏。
    當每一個Action在轉發時,首先在局部Forward中查找與之對應的Forward對象,若是在局部Forward中找不到對應的Forward對象,纔會在全局Forward中查找,局部Forward能夠覆蓋全局Forward. 
    表面上看起來,該Action的兩個屬性只提供了對應的setter和getter方法,很難理解請求參數在何時賦值給該Action的屬性,事實上,由於Struts2的攔載器機制,它們負責解析用戶的請求參數,並將請求參數賦值給Action對應的屬性。
   爲了讓Action能處理用戶請求,還須要在struts.xml中配置一下,struts.xml文件應當放在classes路徑下,該文件主要放置struts2的Action定義,定義struts2 Action時,除了須要指定該Action的實現類外,還須要定義Action處理結果和資源之間的映射關係。
  若是struts2版本是2.1之前 

web.xml配置過濾器的時候應該是這樣: 

<web-app> 
<filter> 
<filter-name>struts2</filter-name> 
<filter-class>

org.apache.struts2.dispatcher.FilterDispatcher
</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>struts2</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 
</web-app> 


若是struts2 版本是2.1.3以上 

web.xml配置 

<web-app> 
<filter>   
<filter-name>struts2</filter-name>   
<filter-class>

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
</filter-class>   
</filter>   
<filter-mapping>   
<filter-name>struts2</filter-name>   
<url-pattern>/*</url-pattern>   
</filter-mapping>   
</web-app> 

一般,當一個用戶登陸成功後,須要將用戶的用戶名添加爲HTTPSession
而JSP頁頁則獲取該Action的處理結果,並將所有結果迭代輸出。
struts.xml放在src文件目錄之下。
<constant name="struts.devMode" value="true" /> 
在開發模式下使用,這樣能夠打印出更詳細的錯誤信息。
struts 2.1.6核心包:
commons-logging-1.1.jar
 freemarker-2.3.8.jar
 ognl-2.6.11.jar
 struts2-core-2.0.8.jar
 xwork-2.0.3.jar
commons-fileupload-1.2.1.jar

commons-fileupload-1.2.1.jar這個jar包必須加載,否則會報錯:報錯內容爲「 [Dispatcher] Dispatcher initialization failed Unable to load configuration. 」

再寫Action類時, 必定要注意,繼承ActionSupport類。

 理論上講,業務邏輯組件,實現業務邏輯方法時,必須實現底層業務持久組件。
Acton類中的成員屬性,並不必定用於封裝用戶的請求參數,也多是封裝了Action須要傳入下一個JSP頁面的顯示屬性。

  Action的全部屬性,都被包裝在ValueStack對象中,Action的屬性,能夠是ValueStack對像中的值。
ActionSupport類是一個工具類,它已經實現了Action接口,除此以外,它還實現了Validateable接口,
提供了數據校驗功能,經過繼承該ActionSupport類,能夠簡化Struts2的Action開發。
  完成輸入校驗須要重寫validate方法,該方法會在執行系統的execute方法以前執行,若是執行該方法以後,Action類的fieldErrors中已經包含了數據校驗錯誤,請求將被轉發到input邏輯視圖處。

Struts2的<s:form/>默認已經提供了輸出校驗錯誤的能力。
Struts2容許經過定義配置文件來完成數據校驗,Struts2提供了大量的數據校驗器,包括表單域校驗器和非表單域校驗器兩種。
    Struts2框架由三個部分組成,核心控制品FilterDispatcher,業務控制器和用戶實現的業務邏輯組件。在這三個部分裏,Struts2框架提供了核心控制器FilterDispatcher,而用戶須要實現業務控制器和業務邏輯組件。
    Filter會過濾用戶請求,若是用戶請求以action結尾,該請求將被轉入Struts2框架處理。
攔截器負責將HttpServletRequest裏的請求數據解析出來,並傳給業務邏輯組件Action實例。
  MVC框架裏的業務控制器會調用模型組件的方法來處理用戶請求。也就是說,業務邏輯控制器不會
對用戶求求進行任務實際處理,用戶請求最終由模型組件負現處理,業務控制器,只是中間負責調度的
調度器。
    一般,全部的MVC框架都須要WEB應用加載一個核心控制器,對於Struts2框架而言,須要加載FilterDispatcher,只要Web應用負責加載FilterDispatcher,FilterDispatcher將會加載應用的Struts2框架。Struts2,將核心控制器設計成Filter而不是一個普通Servlet.
    若是Web應用使用了Servlet2.3之前的規範,由於Web應用不會自動加載Struts2框架的標籤文件,所以必須在Web.xml文件中配置加載Struts2標籤庫。
  配置加載Struts2標籤庫的配置片斷以下:
<taglib>
<taglib-uri>/s</taglib-uri> //過慮全部s開頭的標籤,並指定標籤庫文件位置。
<taglib-location>/WEB-INF/struts-tags.tld</taglib-locaton>
</taglib>
  在上面配置片斷中,指定了Struts2標籤配置文件物理位置 /WEB-INF/struts-tags.tld,所以咱們必須
手動複製Struts2的標籤庫方定義文件。將該文件放置在Web應用的WEB-INF路徑下。若是Web應用使用Servlet2.4以上的規範,則無需在web.xml文件中配置標籤庫定義,由於Servlet2.4規範會自動加載標籤庫定義文件。    
    Struts2的標籤庫定義文件包含在struts2-core-2.1.6.jar文件裏,在struts2-core-2.1.6.jar文件的META-INF路徑下,包含了一個struts-tag.tld文件,這個文件就是Struts2的標籤庫定義文件的。
    struts2框架將自動加載放在WEB-INF/classes路徑下的struts.xml文件。爲了不struts.xml文件過大,提升struts.xml文件的可讀性,咱們能夠將一個struts.xml配置文件分解成多個配置文件,而後在
struts.xml
    不只如此,Struts2框架提供了一種相似Eclipse的擴展方式,它充許以一種「可挺拔」的方式來安裝插件,例如Spring,JSF插件等。它們都提供了一個相似struts2-xxx-plugin.jar的文件,這個文件就是插件安裝文件,只要將該文件放在Web應用的WEB-INF/lib路徑下,Struts2框架將自動加載該框架。
    Struts2框架有兩個核心配置文件,其中struts.xml文件主要負責管理應用中心的Action映射,以及該Action包含 的Result定義等,除此以外,Struts2框架還包含一個struts.properties文件,該文件定義了Struts2框架的大量屬性,能夠經過改變屬性,來知足應用的需求。
    配置Struts2常量值有3個地方一、在struts.properties文件中配置經常二、在Web.xml文件中配置 FilterDispatcher
指定初始化參數來配置常量。三、在Struts.xml文件中使用<constrant../>元素來配置常量。
    struts.devMode:設置是否使用開發模式,若是設置爲true,可使應用出錯時顯示更多的,更友好的
錯誤提示。
   struts.i18n.reload:該常量設置是否每次HTTP請求到達時,系統都從新加載資源文件,默認false,開發階段設成:ture.
   struts.ui.theme:指定視圖標籤默認的視圖主題,默認xhtml.
   struts.ui.theme:所需模板文件的位置。
當某個包指定了命名空間後, 該包下全部的Action處理的URL應該是命名空間+Action名。
     Struts2還能夠顯示指定根命名空間,經過設置某個包的namespace="/"來指定根命名空間。
     默認命名空間裏的Action能夠處理任何模塊下的Action請求。
攔截器其實就是面向切面編程的編程思想,攔截器充許在Action處理以前或者Action處理結束以後,放入開發者本身定義的代碼。
    使用攔截器,能夠完成以下的操做:
一、進行權限控制。二、跟蹤日誌,記錄每一個瀏覽者所請求的每一個Action。三、跟蹤系統的性能瓶頸,記錄每一個Action開始處理和結束處理時間,從而取得耗時較長的Action.
  Struts2,也充許將多個攔截器組合在一塊兒,造成一個攔截器棧。
  Struts2中,最好定義多個小粒度的攔截器,而後組合成攔截器棧來完成大的功能。進而實現複用性。
  定義攔截器棧以前,必須先定義組成。
    一旦定義了攔截器和攔截器棧以後,在Action中使用攔截器或攔截哭器棧的方式是相同的。
Action纔是應用的核心,Action類裏包含了對用戶請求的處理邏輯,所以咱們也稱Action爲業務控制器。
    Struts2一般直接使用Action來封裝HTTP請求超參數,所以Action類裏還應該包含與請求參數對應的屬性,而且爲該屬性提供對應的setter與getter方法。
    系統不會嚴格區分Action裏哪 個屬性是用於封裝請求參八的屬性,哪一個屬性是封裝處理結果的屬性。
因爲ActionSupport徹底可做爲Struts2應用的Action處理類,所以當用戶配置Action類沒有指定class屬性時,系統自動使用ActionSupport類做爲默認的Action處理類。
    Struts2提供了一個ActionContent類,Struts2的Action能夠經過該類來訪問ServletAPI。
struts使用包來組織Action,所以,將Action定義是放在包定義下完成的。
    class屬性並非必需的,若是咱們不爲Action指定class屬性,系統則默認使用系統的ActionSupport
類。
    Action只是一個控制器,它並不直接對用戶生成任何響應,因此,Action處理完請求後,Action須要將指定的視圖資源呈現給用戶。
  動態方法調用是指表單元素的action並非直接等於某個Action的名字,而是以以下形式來指定Form的action屬性。
action="action!methodName.action"
  
    對於使用動態方法調用的方法, 該方法的方法明與系統默認的execute方法的方法聲明只有方法名不一樣,其餘的如方法參數返回值類型都應該絕對相同的。
  在配置<action../>元素時,須要指定name,class和method屬性,其中name能夠支持通配符,而後能夠在
class,method屬笥中使用表達式。
    <action name="*Action".../>元素不是定義了一個普通Action,而是定義了一系列的邏輯Action,只要用戶請求的URL是*Action.action的模式,均可以經過該Actiono類處理,配置該Action元素時,還指定method屬性,使用了表達式{1},該表達式的值就是name屬性值中第一個*的值。
    由於Struts2默認的校驗文件命名遵照以下規則:ActionName-validation.xml,即若是有類名爲MyAction的Action類,則應該提供名爲MyAction-validation.xml文件。
    實際上,Struts2不只能夠在class,name屬性中使用表達式,還能夠在<action.../>元素的<result.../>子元素中使用表達式。以下:
  <action name="*">
   <result>/{1}.jsp</result>
  </action>
  若是有URL爲abcAction.action的請求,若是Struts.xml文件中有名爲abcAction的Action,則必定由該Action來處理用戶請求,若是struts.xml文件中沒有名爲abcAction的Action,則搜尋name屬性值匹配abcAction的Action,除非請求的URL與Action的name屬性絕對相同,不然將按前後順序來決定由那個Action來處理用戶請求。
所以,咱們應該將名爲星號的Action配置在最後,不然Struts2將使用該Action來處理全部
   Struts2還充許在容器中定義一個默認的Action,當用戶請求的URL在容器中找不到對應的Action時,系統將使用默認的Action.配置默認Action經過<default-action-ref.../>元素完成,每一個<default-action-ref.../>元素配置一個默認Action.
    相對於Strut1框架而言,Struts2的邏輯視圖再也不是ActionForward對象,而是一個普通字符串,這樣的設計更有利於將Action類與Struts2框架分離,提供了更好的代碼複用性。
    Struts2經過d struts.xml文件中使用<result.../>元素來配置結果,
    dispatcher結果類型與redirect結果類型的差異主要就是轉發和重定向的差異,重定向會丟失全部的請求參數,請求屬性----固然也丟失了Action的處理結果。
    動態結果的意思是指配置結果時,指定實際視圖資源時使用了表達式語法,經過這種語法能夠容許Action處理完用戶請求後,動態轉入實際的視較長資源。
    配置<result.../>元素時,不只可使用${1}表達式形式來指定視圖資源,還可使用${屬性名}的方式來指定視圖資源。${屬性名}裏的屬性名就是對應Action實例裏的屬性。
   若是一個Action裏包含了與全局結果裏同名的結果,則Action裏的局部Action會覆蓋全局Action。
   採用單獨的Model實例來封裝請求參數和處理結果,這就是所謂的模型驅動。所謂模型驅動,就是使用單獨的javaBean實例。貫穿整個MVC流程。屬性驅動模式,就是使用Action的屬性貫穿整個MVC流程。
    對於採用模型驅動的Action而言,該Action必須實現ModelDriven接口。
    使用模型驅動時,必須實現ModelDriven接口,也必須實現ModelDriven的getModel方法,該方法用於把Action 與對應的模式實例關聯起來。
  配置模型驅動的Action與配置屬性的Action沒有區別。
  Struts2的Action,能夠對提交上來的String參數,進行自動轉換。  
大部分時候,咱們只使用Struts2提供的類型轉換器,以及基於OGNL的類型轉換機制,就能知足大部分類型轉換需求。
    Struts2的類型轉換器其實是基於OGNL實現的,在OGNL項目中有一個TypeConverter接口,這個接口就是實現類型轉換器必須實現的接口。實現類型轉換器必須實現TypeConverter,不過上面接口是的方法太過複雜,因此用DefaultTypeConverter,經過繼承該類來實現本身的類型轉換器,重寫其convertValue方法。
    類型轉換器必須重寫convertvalue方法,該方法須要完成雙向轉換。
    Struts2中每一個Action都有一個校驗文件,所以該文件的文件名應該遵照以下規則:
<Action名字>-validation.xml,且該文件應該被保存在與Action class文件相同的路徑下。
相關文章
相關標籤/搜索