1. 程式人生 > >Struts2框架學習系列(二) Action --struts.xml配置檔案詳解

Struts2框架學習系列(二) Action --struts.xml配置檔案詳解

  注意:有一部份的朋友在某個自定義的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;
    }
    
}