Struts2框架學習系列(二) Action --struts.xml配置檔案詳解
阿新 • • 發佈:2019-02-07
注意:有一部份的朋友在某個自定義的action中定義default-action-ref這個配置的時候,認為在位址列中輸入地址如http://localhost:8080/project的時候(project為專案名),如果該專案後面不輸入任何名字或者輸錯地址,則會自動進入default-action-ref定義的action並進入對應的類方法中進行操作並根據result返回頁面,但是很多人發現結果並不是這樣,而不管怎樣都返回進入到index.jsp頁面。
實際上這一點從原理上來講可以理解,default-action-ref這個配置的意思是當用戶在點選了沒有定義的action時,如果struts沒有找到使用者定義的action名稱,則會自動跳轉到該預設定義的action中。
個人覺得位址列中專案後不寫名稱和名稱不存在是兩個概念。
示列:
1. struts.xml 就在萬用字元例子中配置上預設Action
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="struts2" extends="struts-default"><!-- 配置預設Action --> <default-action-ref name="defaultAction"></default-action-ref> <action name="defaultAction"> <result>/error.jsp</result> </action> <!-- 萬用字元對映(wildcard mappings) --> <action name="*Action"class="com.struts.ComputeAction" method="{1}" > <result name="fruitPage" >/fruit.jsp</result> <!-- <result name="fruitPage" >/{1}.jsp</result>表示式也可以寫在這裡 --> </action> </package> </struts>
2. index.jsp頁面 這裡我們把提交的url :Action地址連結,寫錯打斷,當提交時找不到對應的Action,則會進入預設Action,進入error.jsp頁面
<body> <!-- 使用萬用字元對映(wildcard mappings)方式 使用:Struts2標籤也可以使用HTML標籤 --> <s:form name="form" theme="simple" > num1:<s:textfield name="num1" /> num2:<s:textfield name="num2" /> <!-- 測試預設Action,當提交的Action地址錯誤。則會走預設Action --> <s:submit type="button" value="加" onclick="computeMethod('ssss')" /><!-- 把動態url地址亂寫 --> <s:submit type="button" value="減" onclick="computeMethod('subtractActios')" /><!-- 或在url地址中多加字元 --> </s:form> <!-- js --> <script type="text/javascript"> function computeMethod(op){ document.form.action=op;//改動只有這裡 document.form.submit();//提交 } </script> </body>
3. error.jsp 建立此頁面檢視效果
<body> 錯誤頁面。! 未找到,Action例項時會預設走此頁面! </body>
3.處理結果
Struts2的Action處理完使用者請求後,將返回一個普通字串,整個普通字串就是一個邏輯檢視名。Struts2通過配置邏輯檢視名和物理檢視資源之間的對映關係,一旦系統收到Action返回的某個邏輯檢視名,系統就會把對應的物理檢視資源呈現給瀏覽者。
3.1 配置處理結果: Struts2的Action處理使用者請求結束後,返回一個普通字串-邏輯檢視名,必須在struts.xml檔案中完成邏輯檢視和物理檢視資源的對映,才可讓系統轉到實際的檢視資源。 Struts2通過在struts.xml檔案中使用<result …/>元素來配置結果。Struts2提供了兩種結果。 區域性結果:將<result …/>作為<action …>元素的子元素配置。 全域性結果:將<result …/>作為<global-results …>元素的子元素配置。 在package元素中配置<global-results>子元素: 全域性結果可滿足一個包中多個Action共享一個結果:<!-- 全域性結果可滿足一個包中多個Action共享一個結果,也就是說,當多個Action中都有一個重複的result時就可以使用全域性結果,也就是說公共的result --> <global-results> <result name="fruitPage" type="dispatcher" >/fruit.jsp</result> </global-results>3.2. 處理結果型別: Struts2提供了對不同種類返回結果的支援,常見的有JSP,FreeMarker,Velocity等。 Struts2支援的不同型別的返回結果為:(加粗為常用)
名字 | 說明 |
chain | 用來處理Action鏈 |
dispatcher | 用來轉向頁面,通常處理JSP,這是預設的結果型別 |
freeMarker | 處理FreeMarker模板 |
httpHeader | 用來控制特殊的Http行為 |
redirect | 重定向到一個URL |
redirect-action | 重定向到一個Action |
stream | 向瀏覽器傳送InputSream物件,通常用來處理檔案下載 |
velocity | 處理Velocity模板 |
xslt | 處理XML/XLST模板 |
plaintext | 顯示原始檔案內容,例如檔案原始碼 |
tiles | 結合Tile使用 |
另外第三方的Result型別還包括JasperReports Plugin,專門用來處理JasperReport型別的報表輸出;Jfreechart Plugin;JSF Plugin。
常用示列:
1.struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="struts2" extends="struts-default"> <!-- 預設Action --> <default-action-ref name="defaultAction"></default-action-ref> <!-- 全域性結果可滿足一個包中多個Action共享一個結果,也就是說,當多個Action中都有一個重複的result時就可以使用全域性結果,也就是說公共的result <global-results> <result name="fruitPage" type="dispatcher" >/fruit.jsp</result> </global-results> --> <action name="defaultAction"> <result>/error.jsp</result> </action> <!-- 萬用字元對映(wildcard mappings) --> <action name="*Action" class="com.struts.ComputeAction" method="{1}" > <!--1 表示式{1}也可以寫在url連線中,class,name中都可以寫,也可以寫多少,索引從1開始 <result name="fruitPage" >/{1}.jsp</result> --> <!--2 預設dispatcher轉發跳轉 <result name="fruitPage" type="dispatcher" >/fruit.jsp</result> --> <!--3 重定向跳轉 <result name="fruitPage" type="redirect" >/fruit.jsp</result> --> <!--4 redirectAction: Action例項 與另一個Action例項互相跳轉 <result name="fruitPage" type="redirectAction" >skipAction</result> --> <!--4.1 使用感嘆號指定跳轉方法,xml會顯示報錯,但可以用。 使用?&不能在Action例項中帶引數 <result name="fruitPage" type="redirectAction" >skipAction!add</result> --> <!--4.2 跳轉Action帶引數的方式: actionName:跳轉Action的名稱 method:跳轉Action例項中的哪個方法 num:帶的引數,可寫固定,可使用${屬性名}取上一個Action例項中的屬性,實現動態傳值。 --> <result name="fruitPage" type="redirectAction" > <param name="actionName">skipAction</param> <param name="method">add</param> <param name="num1">${num1}</param> <param name="num2">${num2}</param> </result> </action> <action name="skipAction" class="com.struts.SkipAction" > <result name="success" type="dispatcher" >/fruit.jsp</result> </action> </package> </struts>
2.再建立一個SkipAction 控制器的類
package com.struts; /** * 測試與dispatcherAction之間的傳值 * @author asus * */ public class SkipAction { /** 接收computeAction例項傳過來屬性 */ private int num1; private int num2; private int result;//結果返回給頁面 public String execute(){ System.out.println("當指定要走的方法時不會走此方法"); return "success"; } /**新增的方法 */ public String add(){ result=num1+num2; System.out.println("走add方法!"); return "success"; } /** Get,Set方法 */ public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } public int getResult() { return result; } public void setResult(int result) { this.result = result; } }