Struts2框架是MVC設計思想的實現,Action就是業務控制器,能夠調用業務邏輯模塊進行業務處理,Action的處理結果是經過在配置文件中設定result屬性來實現的。這是一種典型的鬆耦合方式,Action沒必要關心result對應的視圖是什麼,只是返回一個字符串便可。瀏覽器
1、 處理結果流程框架
Struts2框架攔截用戶請求後,會匹配相關的Action來處理,Action執行處理完畢後,將返回一個標準的字符串,該字符串在配置文件中對應了一個視圖資源名稱。Struts2框架是經過配置文件中的result屬性將Action和視圖資源聯繫在一塊兒的,這樣就實現了獨立模塊化的設計思想。Result對應的視圖資源,就是MVC模式中的視圖部分(View)。jsp
2、 配置result模塊化
1. 配置result的目的就是告訴Struts2框架,在執行完一個Action後,須要系統作什麼。是把一個視圖資源呈現給用戶仍是執行另一個Action,result配置起到了一個「路標」的做用。編碼
2. result按照做用範圍能夠分爲局部result和全局result。spa
局部result: 包含在Action定義中,result屬性是一個Action的子元素。起做用範圍只能在本Action中。插件
全局result: 使用<global-results…/>來定義,其做用範圍是全部的Action均可以使用。設計
下面是result的示例:xml
<package name="ch03 " extends="sturts-default " namespace=" /ch03" >ci
<!—定義全局返回類型 -->
<global-results>
<result name="global-result">/welcome.jsp</result>
</global-results>
<action name="Regist" class="ch03.Regist">
<!—定義局部返回類型 -->
<result name="success" type="dispatcher">/ch03/success.jsp</result>
<result name="input">/ch03/regist.jsp</result>
</action>
</package>
3、 result的類型
Struts2框架支持多種視圖技術,例如JSP、FreeMarker等。當一個Action執行完用戶請求後,會返回一個標準的字符串,這個字符串就是邏輯視圖名稱,該邏輯視圖名稱並無與任何視圖技術聯繫在一塊兒。視圖技術或者說使用的result類型,是在配置文件中指定的,即指定result元素的type屬性來實現。
Struts2框架默認支持的result類型以下:
chain:Action鏈式處理的result類型。
chart:用於整合JfreeChart的result類型。
dispatcher:用於整合JSP的result類型。
freemarker:用於整合FreeMarker的result類型。
httpheader:用於處理特殊HTTP行爲的result類型。
jasper:用於整合JasperReport的result類型。
jsf: 用於整合JSF類型。
redirect:用於重定向的result類型。
redirect-action:用於重定向到其餘Action的result類型。
stream:用於向瀏覽器返回一個Inputstream。
tites:用於整合Tiles的result類型。
velocity:用於整合Velocity的result類型。
xslt:用於整合XML/XSLT的result類型。
plaintext:用於顯示頁面的原始代碼的result類型。
說明:以上是Struts2框架的內建的result類型,都在struts-default.xml中定義的,系統會自動加載該result類型。另一種result類型是採用插件的方式來支持的。
Action-chain類型示例:
<package name="ch03 " extends="sturts-default " >
<!—定義user, result指向Regist Action -->
<action name="user" class="…">
<result type="chain" >Regist</result>
</action>
<action name="Regist" class="…">
<!—連接到另一個命名空間-->
<result type="chain">
<param name="namespace">/secure</param>
<param name="actionName">check</param>
</result>
</action>
</package>
<!—定義包secure,命名空間爲secure -->
<package name="secure " extends="sturts-default " namespace="/secure" >
<action name="check" class="…">
<result>/secure/check.jsp</result>
</action>
</package>
4、 動態配置result
前面介紹的result配置都是以硬編碼的方式保存在struts.xml文件中,實際上,Struts2框架提供了動態配置result的功能。動態配置result是指在struts.xml配置文件中,配置Action中的result時,可使用表達式或通配符來定位視圖資源,經過這種方式,來動態實現返回不一樣的視圖資源。
1. 使用通配符動態配置result
在struts.xml的Action配置中,通配符不單單可使用在method配置上,class和result均可以使用通配符。 以下示例:
<package name="ch02" extends="sturts-default " >
<!—通配符配置result -->
<action name="Login_*" class="ch02.Login_{1}">
<result name="success" >/ch02/{1}.jsp</result>
</action>
</package>
如上代碼中使用了通配符,配置了一個名爲Login_*的Action,這個Action能夠處
理全部匹配Login_*.action的用戶請求。例如,用戶產生一個URL請求
Login_Bank.action,Struts2框架會先在struts.xml文件中查找是否有名字爲
Login_Bank的配置,若是找不到,則匹配Login_*的Action配置,
框架會將ch02.Login_{1}中的{1}匹配爲Bank,即對應ch02.Login_Bank的
Action實現類。一樣在result配置中,也會匹配爲/ch02/Bank.jsp的實際視圖資
源。
2. 使用OGNL動態配置result
通常狀況下,若是訪問Action實例中的屬性,可使用${屬性名}表達式,實際上,一個OGNL的完整表達式應該是${屬性名.屬性名.屬性名}。下面的實例演示使用OGNL動態配置result。
<package name="ch02" extends="sturts-default " >
<!—使用OGNL表達式配置result-->
<action name="Login_Bank" class="ch02.Login_Bank">
<result name="success" >/ch02/${bankname}.jsp</result>
</action>
</package>
注意: ${bankname}是指Action中的bankname的屬性值,Action實例賦予
bankname不一樣的值,就會指向不一樣的視圖資源。