struts2中struts.xml配置文件詳解

struts.xml的經常使用配置 javascript

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 全部匹配*.action的請求都由struts2處理 -->
    <constant name="struts.action.extension" value="action" />
    <!-- 是否啓用開發模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- struts配置文件改動後,是否從新加載 -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 設置瀏覽器是否緩存靜態內容 -->
    <constant name="struts.serve.static.browserCache" value="false" />
    <!-- 請求參數的編碼方式 -->
    <constant name="struts.i18n.encoding" value="utf-8" />
    <!-- 每次HTTP請求系統都從新加載資源文件,有助於開發 -->
    <constant name="struts.i18n.reload" value="true" />
    <!-- 文件上傳最大值 -->
    <constant name="struts.multipart.maxSize" value="104857600" />
    <!-- 讓struts2支持動態方法調用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <!-- Action名稱中是否仍是用斜線 -->
    <constant name="struts.enable.SlashesInActionNames" value="false" />
    <!-- 容許標籤中使用表達式語法 -->
    <constant name="struts.tag.altSyntax" value="true" />
    <!-- 對於WebLogic,Orion,OC4J此屬性應該設置成true -->
    <constant name="struts.dispatcher.parametersWorkaround" value="false" />

    <package name="basePackage" extends="struts-default">


    </package>

</struts>

  

<?xml version="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>

    <!-- 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>

 

一個Action內包含多個請求處理方法的處理java

Struts1提供了DispatchAction,從而容許一個Action內包含多個請求處理方法。Struts2也提供了相似的功能。ios

處理方式主要有如下三種方式:apache

 

1. 1   動態方法調用:瀏覽器

  DMI:Dynamic Method Invocation 動態方法調用。
  動態方法調用是指:表單元素的action不直接等於某個Action的名字,而是以 感嘆號後加方法名來指定對應的動做名:
    <!-- 動態方法調用HTML標籤與Struts2標籤 -->
        <form action="computeAction!add.action" name="from" >
        <s:form action="computeAction!add.action" name="form" theme="simple" >

  則用戶的請求將提交到名爲」computeAction」的Action實例,Action實例將調用名爲」add」方法來處理請求。
  當指定調用某一方法來處理請求時,就不會走默認執行處理請求的execute()方法。緩存

  注意:要使用動態方法調用,必須設置Struts2容許動態方法調用,經過設置struts.enable.DynamicMethodInvocation常量來完成,該常量屬性的默認值是true。安全

<struts>
    <!-- 
        //禁用動態方法調用,默認爲true啓用,false禁用
        constant:name="struts.enable.DynamicMethodInvocation"
     -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
</struts>

 

示列:簡單的一個加法和減法例子。app

1. index.jsp用戶在頁面輸入兩個數字,選擇相加,或者相減
   當用戶點擊加或減須要走同一個Action但處理請求方法不一樣,這裏使用了js動態選擇。jsp

<body>
    <!-- 動態方法調用    使用:Struts2標籤也可使用HTML標籤 -->
        <s: name="form" theme="simple" >
        
            num1:<s:textfield name="num1" />
            num2:<s:textfield name="num2" />
            <s:submit type="button" value="加" onclick="computeMethod('add')" />
            <s:submit type="button" value="減" onclick="computeMethod('subtract')" />
        </s:form>
        
         
        
    <!-- js -->
    <script type="text/javascript">
        function computeMethod(op){
            document.form.action="computeAction!"+op;//動態選擇處理請求的方法
            document.form.submit();//提交
        }
    </script>
            
  </body>

 

2. 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>
    <!-- 
        //禁用動態方法調用,默認爲true啓用,false禁用
        constant:name="struts.enable.DynamicMethodInvocation"
     -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <package name="struts2" extends="struts-default">
        <action name="computeAction" class="com.struts.ComputeAction" >
            <result name="fruitPage" >/fruit.jsp</result>
        </action>
    </package>
</struts>

 

3. ComputeAction控制器的類處理請求

package com.struts;
/**
 * Struts2控制器的類
 * @author asus
 *
 */
public class ComputeAction {

    /** 屬性 */
    private int num1;
    private int num2;
    private int fruit;//結果
    
    /** 若請求爲指定操做方法默認執行execute()方法 */
    public String execute(){
        
        System.out.println("當調用其它方法就不會走這個方法!");
        return "";
    }
    
    /** 執行處理加法 */
    public String add(){
        this.fruit=num1+num2;//
        return "fruitPage";
    }
    
    /** 執行處理減法 */
    public String subtract(){
        this.fruit=num1-num2;//
        return "fruitPage";
    }
    
    
    
    
    /** JavaBean */
    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 getFruit() {
        return fruit;
    }

    public void setFruit(int fruit) {
        this.fruit = fruit;
    }
    
}

 

4. fruit.jsp響應結果的頁面

<body>
            <!-- 結果頁面 -->
            計算結果:<s:property value="fruit" />
</body>

 

1.2Action配置method屬性(示列與以上代碼大多一致,只修改有變動的):

  將Action類中的每個處理方法都定義成一個邏輯Action方法。

1. index.jsp頁面

  <body>
  
    <!-- Action配置method屬性    使用:Struts2標籤也可使用HTML標籤 -->
        <s:form name="form" theme="simple" >
        
            num1:<s:textfield name="num1" />
            num2:<s:textfield name="num2" />
            <s:submit type="button" value="加" onclick="computeMethod('addAction')" />
            <s:submit type="button" value="減" onclick="computeMethod('subtractAction')" />
        </s:form>
        
         
        
    <!-- js -->
    <script type="text/javascript">
        function computeMethod(op){
            document.form.action=op;//動態選擇處理請求的方法
            document.form.submit();//提交
        }
            
    </script>
            
  </body>

 

2. 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 name="addAction" class="com.struts.ComputeAction" method="add" >
            <result name="fruitPage" >/fruit.jsp</result>
        </action>
        <action name="subtractAction" class="com.struts.ComputeAction" method="subtract" >
            <result name="fruitPage" >/fruit.jsp</result>
        </action>
    </package>
</struts>

  經過action元素的method屬性來指定Action執行時調用的方法。

    優勢:使得以更加安全的方式來實現動態方法的調用,不讓別人看到你的實現方法。
    缺點:繁瑣,一個處理請求的方法要跟一個action。

  Struts2根據method屬性查找方法有兩種途徑:

        1.查找與method屬性值徹底一致的方法
        2.查找doMethod形式的方法

   使用動態方法調用和method屬性的區別:

    1.經過以上三個struts.xml中的配置信息例子來講,他們的共同點是都在操做同一個Action。

    2.<form action="">中請求地址不一樣。

    3.動態方法的返回值相同,則會經過result進入一個頁面。而method屬性就算兩個方法的返回值相同但進去不一樣的result,可能會進入兩個不一樣的頁面。

    由上能夠分析出:
      (1)若是使用同一個Action,不一樣的處理請求的方法,響應使用相同的配置(result等)則使用動態方法調用。

      (2)若是使用同一個Action,不一樣的處理請求的方法,響應分別使用不一樣的配置,則使用action元素的method屬性,爲同一個Action配置多個名稱。

      

 1.3使用通配符映射(wildcard mappings)方式(示列與以上代碼大多一致,只修改有變動的):

1. index.jsp頁面只改動了js部分。

 <body>
    
    <!-- 使用通配符映射(wildcard mappings)方式    使用:Struts2標籤也可使用HTML標籤 -->
        <s:form name="form" theme="simple" >
        
            num1:<s:textfield name="num1" />
            num2:<s:textfield name="num2" />
            <s:submit type="button" value="加" onclick="computeMethod('addAction')" />
            <s:submit type="button" value="減" onclick="computeMethod('subtractAction')" />
        </s:form>
        
         
        
    <!-- js -->
    <script type="text/javascript">
        function computeMethod(op){
            document.form.action=op;//相比mothod屬性改動只有這裏
            document.form.submit();//提交
        }
            
    </script>
            
  </body>

 

 2.struts.xml的配置信息

  在使用method屬性來實現同一個Action的不一樣方法處理不一樣的請求時,會發現,隨着方法的增多,從而致使大量的Action配置,這時咱們就須要經過使用通配符來解決Action配置過多的方法。

  在配置<action.../>元素時,須要指定name、class、method屬性。其中name屬性可支持通配符,而後能夠在class、method屬性中使用表達式。通配符用星號 * 表示。

<?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 name="*Action" class="com.struts.ComputeAction" method="{1}" >
            <result name="fruitPage" >/fruit.jsp</result>
            <!-- <result name="fruitPage" >/{1}.jsp</result>表達式也能夠寫在這裏 -->
        </action>
    </package>
</struts>

 

2.默認Action:
  在瀏覽器輸入一個不存在的Action,頁面將呈現404錯誤,爲了網站更友好,咱們能夠設置一個默認的Action。
  
   注意:有一部份的朋友在某個自定義的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;
    }
    
}
相關文章
相關標籤/搜索