1 客戶端發送請求;
2這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助,例如:SiteMeshPlugin)
3接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否須要調用某個Action。FilterDispatcher的功能以下:
(1)執行Actions
(2)清除ActionContext
(3)維護靜態內容
(4)清除request生命週期內的XWork的interceptorsjava
4若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy經過ConfigurationManager詢問框架的配置文件,找到須要調用的Action類
6ActionProxy建立一個ActionInvocation的實例。
7ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。
8一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也多是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。在表示的過程當中可使用Struts2框架中繼承的標籤。在這個過程當中須要涉及到ActionMapper數據庫
一、攔截器是基於java反射機制的,而過濾器是基於函數回調的
二、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
三、攔截器只能對Action請求起做用,而過濾器則能夠對幾乎全部請求起做用。
四、攔截器能夠訪問Action上下文、值棧裏的對象,而過濾器不能。
五、在Action的生命週期中,攔截器能夠屢次調用,而過濾器只能在容器初始化時被調用一次。apache
在上述過程當中全部的對象(Action,Results,Interceptors,等)都是經過ObjectFactory來建立的。Struts2的目標很簡單--使Web開發變得更加容易。爲了達成這一目標,Struts2中提供了不少新特性,好比智能的默認設置、annotation的使用以及"慣例重於配置"原則的應用,而這一切都大大減小了XML配置。Struts2中的Action都是POJO,這一方面加強了Action自己的可測試性,另外一方面也減少了框架內部的耦合度,而HTML表單中的輸入項都被轉換成了恰當的類型以供action使用。開發人員還能夠經過攔截器(能夠自定義攔截器或者使用Struts2提供的攔截器)來對請求進行預處理和後處理,這樣一來,處理請求就變得更加模塊化,從而進一步減少耦合度。模塊化是一個通用的主題--能夠經過插件機制來對框架進行擴展;開發人員可使用自定義的實現來替換掉框架的關鍵類,從而得到框架自己所不具有的功能;能夠用標籤來渲染多種主題(包括自定義的主題);Action執行完畢之後,能夠有多種結果類型--包括渲染JSP頁面,Velocity和Freemarker模板,但並不只限於這些api
常量---------值------------------------------邏輯含義 SUCCESS: success:表示程序處理異常,並返回給用戶成功後的結果 NONE none 表示處理正常結束,但不返回給用戶任何提示 ERROR error 表示處理結果失敗 INPUT input 表示須要更多用戶輸入才能順利執行 LOGIN login 表示須要用戶正確登陸後才能順利執行
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >session
<struts>app
<!-- include節點是struts2中組件化的方式 能夠將每一個功能模塊獨立到一個xml配置文件中 而後用include節點引用 --> <include file="struts-default.xml"></include> <!-- package提供了將多個Action組織爲一個模塊的方式 package的名字必須是惟一的 package能夠擴展 當一個package擴展自 另外一個package時該package會在自己配置的基礎上加入擴展的package 的配置 父package必須在子package前配置 name:package名稱 extends:繼承的父package名稱 abstract:設置package的屬性爲抽象的 抽象的package不能定義action 值true:false namespace:定義package命名空間 該命名空間影響到url的地址,例如此命名空間爲/test那麼訪問是的地址爲http://localhost:8080/struts2/test/XX.action --> <package name="com.kay.struts2" extends="struts-default" namespace="/test"> <interceptors> <!-- 定義攔截器 name:攔截器名稱 class:攔截器類路徑 --> <interceptor name="timer" class="com.kay.timer"></interceptor> <interceptor name="logger" class="com.kay.logger"></interceptor> <!-- 定義攔截器棧 --> <interceptor-stack name="mystack"> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="logger"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 定義默認的攔截器 每一個Action都會自動引用 若是Action中引用了其它的攔截器 默認的攔截器將無效 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 全局results配置 --> <global-results> <result name="input">/error.jsp</result> </global-results> <!-- Action配置 一個Action能夠被屢次映射(只要action配置中的name不一樣) name:action名稱 class: 對應的類的路徑 method: 調用Action中的方法名 --> <action name="hello" class="com.kay.struts2.Action.LoginAction"> <!-- 引用攔截器 name:攔截器名稱或攔截器棧名稱 --> <interceptor-ref name="timer"></interceptor-ref> <!-- 節點配置 name : result名稱 和Action中返回的值相同 type : result類型 不寫則選用superpackage的type struts-default.xml中的默認爲dispatcher --> <result name="success" type="dispatcher">/talk.jsp</result> <!-- 參數設置 name:對應Action中的get/set方法 --> <param name="url">http://www.sina.com</param> </action> </package>
</struts>框架
struts.xml是咱們在開發中利用率最高的文件,也是Struts2中最重要的配置文件。 一下分別介紹一下幾個struts.xml中經常使用到的標籤 一、<include>
利用include標籤,能夠將一個struts.xml配置文件分割成多個配置文件,而後在struts.xml中使用<include>標籤引入其餘配置文件。 好比一個網上購物程序,能夠把用戶配置、商品配置、訂單配置分別放在3個配置文件user.xml、goods.xml和order.xml中,而後在struts.xml中將這3個配置文件引入: struts.xml: ? 1 2 3 4 5 6 7 8 9 10 <?xmlversion="1.0"encoding="UTF-8"?>jsp
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">ide
<struts> <includefile="user.xml"/> <includefile="goods.xml"/> <includefile="order.xml"/> </struts>模塊化
user.xml: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <packagename="wwfy"extends="struts-default"> <actionname="login"class="wwfy.user.LoginAction"> <!--省略Action其餘配置--> </action> <actionname="logout"class="wwfy.user.LogoutAction"> <!--省略Action其餘配置--> </action> </package> </struts>
二、<constant> 在以前提到struts.properties配置文件的介紹中,咱們曾經提到全部在struts.properties文件中定義的屬性,均可以配置在struts.xml文件中。而在struts.xml中,是經過<constant>標籤來進行配置的: ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <!--設置開發模式--> <constantname="struts.devMode"value="true"/> <!--設置編碼形式爲GB2312--> <constantname="struts.i18n.encoding"value="GB2312"/> <!--省略其餘配置信息--> </struts>
三、<package> 一、包屬性介紹 在Struts2框架中是經過包來管理action、result、interceptor、interceptor-stack等配置信息的。包屬性以下: 屬性 是否必需 描述 name 是 包名,做爲其它包應用本包的標記 extends 否 設置本包繼承其它包 namespace 否 設置包的命名空間 abstact 否 設置爲抽象包
二、extends屬性的詳解 當一個包經過配置extends屬性繼承了另外一個包的時候,該包將會繼承父包中全部的配置,包括action、result、interceptor等。 因爲包信息的獲取是按照配置文件的前後順序進行的,因此父包必須在子包以前被定義。 一般咱們配置struts.xml的時候,都繼承一個名爲「struts-default.xml」的包,這是struts2中內置的包。
三、namespace的詳解 namespace主要是針對大型項目中Action的管理,更重要的是解決Action重名問題,由於不在同一個命名空間的Action可使用相同的Action名的。 1)若是使用命名空間則URL將改變 好比咱們有一下配置文件 ? 1 2 3 4 5 <packagename="wwfy"extends="struts-default"> <actionname="login"class="wwfy.action.LoginAction"> <result>/success.jsp</result> </action> </package>
則此配置下的Action的URL爲http://localhost:8080/login.action
假如爲這個包指定了命名空間 ? 1 2 3 4 5 <packagename="wwfy"extends="struts-default"namespace="/user"> <actionname="login"class="wwfy.action.LoginAction"> <result>/success.jsp</result> </action> </package>
則此配置下的Action的URL爲http://localhost:8080/user/login.action 2)默認命名空間 Struts2中若是沒有爲某個包指定命名空間,該包使用默認的命名空間,默認的命名空間老是""。 3)指定根命名空間 當設置了命名空間爲「/」,即指定了包的命名空間爲根命名空間時,此時全部根路徑下的Action請求都會去這個包中查找對應的資源信息。 倘若前例中路徑爲http://localhost:8080/login.action則全部http://localhost:8080/*.action都會到設置爲根命名空間的包中尋找資源。
四、<action>與<result> 一、<action>屬性介紹 屬性名稱 是否必須 功能描述 name 是 請求的Action名稱 class 否 Action處理類對應具體路徑 method 否 指定Action中的方法名 converter 否 指定Action使用的類型轉換器 若是沒有指定method則默認執行Action中的execute方法。 二、<result>屬性介紹 屬性名稱 是否必須 功能描述 name 否 對應Action返回邏輯視圖名稱,默認爲success type 否 返回結果類型,默認爲dispatcher
三、通配符的使用 隨着result的增長,struts.xml文件也會隨之變得愈來愈複雜。那麼就可使用通配符來簡化配置: 例以下面這個案例: Action爲Test.java
? 1 2 3 4 5 6 7 8 9 10 11 12 13 publicclassTest { publicString test1(){ return"result1"; }
publicString test2(){ return"result2"; } publicString test3(){ return"result3"; }
}
struts.xml中配置爲 ? 1 2 3 4 5 <packagename="wwfy"extends="struts-default"> <actionname="test*"class="wwfy.action.test{1}"> <resultname="result{1}">/result{1}.jsp</result> </action> </package> 四、訪問Action方法的另外一種實現方式 在Struts2中若是要訪問Action中的指定方法,還能夠經過改變URL請求來實現,將本來的「Action名稱.action」改成「Action名稱!方法名稱.action」在struts.xml中就不須要指定方法名了。
五、<exception-mapping>與<global-exception-mapping> 這兩個標籤都是用來配置發生異常時對應的視圖信息的,只不過一個是Action範圍的,一個是包範圍的,當同一類型異常在兩個範圍都被配置時,Action範圍的優先級要高於包範圍的優先級.這兩個標籤包含的屬性也是同樣的: 屬性名稱 是否必須 功能描述 name 否 用來表示該異常配置信息 result 是 指定發生異常時顯示的視圖信息,這裏要配置爲邏輯視圖 exception 是 指定異常類型
兩個標籤的示例代碼爲: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <packagename="default"extends="struts-default"> <global-exception-mappings> <exception-mappingresult="邏輯視圖"exception="異常類型"/> </global-exception-mappings> <actionname="Action名稱"> <exception-mappingresult="邏輯視圖"exception="異常類型"/> </action> </package> </struts>
六、<default-class-ref> 當咱們在配置Action的時候,若是沒有爲某個Action指定具體的class值時,系統將自動引用<default-class-ref>標籤中所指定的類。在Struts2框架中,系統默認的class爲ActionSupport,該配置咱們能夠在xwork的核心包下的xwork-default.xml文件中找到。 有特殊須要時,能夠手動指定默認的class ? 1 2 3 4 5 6 7 packagewwfy.action;
publicclassDefaultClassRef { publicvoidexecute(){ System.out.println("默認class開始執行……"); } }
在struts.xml中配置
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <packagename="wwfy"extends="struts-default"> <!-- 指定默認class爲Test --> <default-class-refclass="wwfy.action.DefaultClassRef"/> <actionname="test1"> <result>/index.jsp</result> </action> </package> </struts>
七、<default-action-ref> 若是在請求一個沒有定義過的Action資源時,系統就會拋出404錯誤。這種錯誤不可避免,但這樣的頁面並不友好。咱們可使用<default-action-ref>來指定一個默認的Action,若是系統沒有找到指定的Action,就會指定來調用這個默認的Action。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <packagename="wwfy"extends="struts-default">
<default-action-refname="acctionError"></default-action-ref> <actionname="acctionError"> <result>/jsp/actionError.jsp</result> </action> </package>
</struts>
八、<default-interceptor-ref> 該標籤用來設置整個包範圍內全部Action所要應用的默認攔截器信息。事實上咱們的包繼承了struts-default包之後,使用的是Struts的默認設置。咱們能夠在struts-default.xml中找到相關配置: ? 1 <default-interceptor-refname="defaultStack"/>
在實際開發過程當中,若是咱們有特殊的需求是能夠改變默認攔截器配置的。當時一旦更改這個配置,「defaultStack」將再也不被引用,須要手動最加。
九、<interceptors> 經過該標籤能夠向Struts2框架中註冊攔截器或者攔截器棧,通常多用於自定義攔截器或攔截器棧的註冊。該標籤使用方法以下: ? 1 2 3 4 5 6 <interceptors> <interceptorname="攔截器名"class="攔截器類"/> <interceptor-stackname="攔截器棧名"> <interceptor-refname="攔截器名"> </interceptor-stack> </interceptors>
十、<interceptor-ref> 經過該標籤能夠爲其所在的Action添加攔截器功能。當爲某個Action單獨添加攔截器功能後,<default-interceptor-ref>中所指定的攔截器將再也不對這個Action起做用。
十一、<global-results> 該標籤用於設置包範圍內的全局結果集。在多個Action返回相同邏輯視圖的狀況下,能夠經過<global-results>標籤統一配置這些物理視圖所對應的邏輯視圖。 ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts> <packagename="wwfy"extends="struts-default"> <global-results> <resultname="test">/index.jsp</result> </global-results> </package> </struts> ### 六:Struts 2訪問Servlet API對象 1. 最經常使用的Servlet api三個接口: HttpServletRequest HttpSession ServletContext 2. Servlet API解耦的訪問方式: //解偶方式得到session request ActionContext context=ActionContext.getContext(); //得到session Map session=context.getSession(); //得到request Map request=(Map)context.get("request"); 3. 關於注入的概念: 簡單的說就是經過框架自動對Action屬性進行賦值,和Spring中的依賴注入相似。 ### 七:Struts 2標籤: 1.<%@ taglib prefix=」s」 uri=」/struts-tags」%> 2.UI標籤:可分爲三大部分: 表單標籤 非表單標籤 Ajax標籤
表單標籤的圖解:
標籤 說明
<s:form>…..</s:form> 獲取相應的form值
<s:textfield>……..</> 文本框輸入
<s:password>……..</> 密碼框輸入
<s:textarea>………</> 文本域輸入
<s:radio>……………..</> 單選按鈕
<s:checkbox>………….</> 複選框
<s:submit>………….</> 提交按鈕
<s:reset>………………</> 重置按鈕
<s:hidden>……………</> 隱藏域標籤
名稱 標籤
根據表達式的值,判斷將要執行的內容
條件標籤 <s:if>…..</>
<s:elseif>……</>
<s:else>……….</>
迭代標籤 <s:iterator>………….</> 用於遍歷集合
(1.)三個標籤中只有<s:if……./>標籤能夠單獨使用。 (2.)三個標籤能夠組合使用<s:elseif……../>標籤與<s:else……/>標籤不能單獨使用,必須與<s:if…../>標籤結合才能使用。 (3.)<s:if……./>標籤能夠與多個<s:elseif……./>結合使用,可是隻能與一個<s:else……../>標籤結合在一塊兒。