一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

struts2中struts.xml配置文件詳解

 蘇氏IT館 2017-07-21

struts.xml的常用配置 

復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts./dtds/struts-2.3.dtd">
<struts>
    <!-- 所有匹配*.action的請求都由struts2處理 -->
    <constant name="struts.action.extension" value="action" />
    <!-- 是否啟用開發(fā)模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- struts配置文件改動后,是否重新加載 -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 設置瀏覽器是否緩存靜態(tài)內(nèi)容 -->
    <constant name="struts.serve.static.browserCache" value="false" />
    <!-- 請求參數(shù)的編碼方式 -->
    <constant name="struts.i18n.encoding" value="utf-8" />
    <!-- 每次HTTP請求系統(tǒng)都重新加載資源文件,有助于開發(fā) -->
    <constant name="struts.i18n.reload" value="true" />
    <!-- 文件上傳最大值 -->
    <constant name="struts.multipart.maxSize" value="104857600" />
    <!-- 讓struts2支持動態(tài)方法調用 -->
    <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./dtds/struts-2.0.dtd" >
<struts>

    <!-- include節(jié)點是struts2中組件化的方式 可以將每個功能模塊獨立到一個xml配置文件中 然后用include節(jié)點引用 -->
    <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>
        
            <!-- 節(jié)點配置
                name : result名稱 和Action中返回的值相同
                type : result類型 不寫則選用superpackage的type struts-default.xml中的默認為dispatcher
             -->
         <result name="success" type="dispatcher">/talk.jsp</result>
         <!-- 參數(shù)設置 
             name:對應Action中的get/set方法 
         -->
         <param name="url">http://www.sina.com</param>
        </action>
    </package>
</struts>
復制代碼

 

一個Action內(nèi)包含多個請求處理方法的處理

Struts1提供了DispatchAction,從而允許一個Action內(nèi)包含多個請求處理方法。Struts2也提供了類似的功能。

處理方式主要有以下三種方式:

 

1. 1   動態(tài)方法調用:

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

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

  注意:要使用動態(tài)方法調用,必須設置Struts2允許動態(tài)方法調用,通過設置struts.enable.DynamicMethodInvocation常量來完成,該常量屬性的默認值是true。

復制代碼
<struts>
    <!-- 
        //禁用動態(tài)方法調用,默認為true啟用,false禁用
        constant:name="struts.enable.DynamicMethodInvocation"
     -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
</struts>
復制代碼

 

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

1. index.jsp用戶在頁面輸入兩個數(shù)字,選擇相加,或者相減
   當用戶點擊加或減需要走同一個Action但處理請求方法不同,這里使用了js動態(tài)選擇。

復制代碼
<body>
    <!-- 動態(tài)方法調用    使用: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;//動態(tài)選擇處理請求的方法
            document.form.submit();//提交
        }
    </script>
            
  </body>
復制代碼

 

2. struts.xml配置信息,啟用動態(tài)方法調用(可選)

復制代碼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" >
<struts>
    <!-- 
        //禁用動態(tài)方法調用,默認為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;//結果
    
    /** 若請求為指定操作方法默認執(zhí)行execute()方法 */
    public String execute(){
        
        System.out.println("當調用其它方法就不會走這個方法!");
        return "";
    }
    
    /** 執(zhí)行處理加法 */
    public String add(){
        this.fruit=num1+num2;//
        return "fruitPage";
    }
    
    /** 執(zhí)行處理減法 */
    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;//動態(tài)選擇處理請求的方法
            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執(zhí)行時調用的方法。

    優(yōu)點:使得以更加安全的方式來實現(xiàn)動態(tài)方法的調用,不讓別人看到你的實現(xiàn)方法。
    缺點:繁瑣,一個處理請求的方法要跟一個action。

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

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

   使用動態(tài)方法調用和method屬性的區(qū)別:

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

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

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

    由上可以分析出:
      (1)如果使用同一個Action,不同的處理請求的方法,響應使用相同的配置(result等)則使用動態(tài)方法調用。

      (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屬性來實現(xiàn)同一個Action的不同方法處理不同的請求時,會發(fā)現(xiàn),隨著方法的增多,從而導致大量的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,頁面將呈現(xiàn)404錯誤,為了網(wǎng)站更友好,我們可以設置一個默認的Action。
  注意:有一部份的朋友在某個自定義的action中定義default-action-ref這個配置的時候,認為在地址欄中輸入地址如http://localhost:8080/project的時候(project為項目名),如果該項目后面不輸入任何名字或者輸錯地址,則會自動進入default-action-ref定義的action并進入對應的類方法中進行操作并根據(jù)result返回頁面,但是很多人發(fā)現(xiàn)結果并不是這樣,而不管怎樣都返回進入到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')" /><!-- 把動態(tài)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 創(chuàng)建此頁面查看效果

  <body>
           錯誤頁面。!
               未找到,Action實例時會默認走此頁面!
  </body>

 

3.處理結果

  Struts2的Action處理完用戶請求后,將返回一個普通字符串,整個普通字符串就是一個邏輯視圖名。Struts2通過配置邏輯視圖名和物理視圖資源之間的映射關系,一旦系統(tǒng)收到Action返回的某個邏輯視圖名,系統(tǒng)就會把對應的物理視圖資源呈現(xiàn)給瀏覽者。

3.1    配置處理結果:
  Struts2的Action處理用戶請求結束后,返回一個普通字符串-邏輯視圖名,必須在struts.xml文件中完成邏輯視圖和物理視圖資源的映射,才可讓系統(tǒng)轉到實際的視圖資源。
  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,F(xiàn)reeMarker,Velocity等。
  Struts2支持的不同類型的返回結果為:(加粗為常用)
名字 說明
chain 用來處理Action鏈
dispatcher 用來轉向頁面,通常處理JSP,這是默認的結果類型
freeMarker 處理FreeMarker模板
httpHeader 用來控制特殊的Http行為
redirect 重定向到一個URL
redirect-action 重定向到一個Action
stream 向瀏覽器發(fā)送InputSream對象,通常用來處理文件下載
velocity 處理Velocity模板
xslt 處理XML/XLST模板
plaintext 顯示原始文件內(nèi)容,例如文件源代碼
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轉發(fā)跳轉
            <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實例中帶參數(shù)
            <result name="fruitPage" type="redirectAction" >skipAction!add</result> -->
            
            <!--4.2
                跳轉Action帶參數(shù)的方式:
                    actionName:跳轉Action的名稱
                    method:跳轉Action實例中的哪個方法
                    num:帶的參數(shù),可寫固定,可使用${屬性名}取上一個Action實例中的屬性,實現(xiàn)動態(tài)傳值。
             -->
            <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.再創(chuàng)建一個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;
    }
    
}
復制代碼

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    大香蕉精品视频一区二区| 五月婷婷六月丁香在线观看 | 大伊香蕉一区二区三区| 极品少妇嫩草视频在线观看| 欧美色欧美亚洲日在线| 国产一区二区久久综合| 中文字幕禁断介一区二区| 日韩精品一区二区三区四区| 国产精品一区二区日韩新区| 日韩无套内射免费精品| 久久精品国产一区久久久| 亚洲中文字幕一区三区| 中文字幕久热精品视频在线 | 欧美日韩有码一二三区| 亚洲一区二区三区免费的视频| 欧美精品中文字幕亚洲| 国产成人精品久久二区二区| 国产精品激情在线观看| 欧美精品中文字幕亚洲| 亚洲欧美日本视频一区二区| 国产免费自拍黄片免费看| 欧美大粗爽一区二区三区| 国产亚洲午夜高清国产拍精品| 欧美亚洲美女资源国产| 日韩一级毛一欧美一级乱| 日本午夜一本久久久综合| 久热这里只有精品九九| 中文字幕亚洲精品在线播放| 欧洲精品一区二区三区四区| 国产精品不卡高清在线观看 | 伊人色综合久久伊人婷婷| 日本黄色高清视频久久| 国产人妻熟女高跟丝袜| 成人午夜视频在线播放| 久久热九九这里只有精品| 又大又紧又硬又湿又爽又猛| 国产对白老熟女正在播放| 日韩人妻有码一区二区| 欧美日韩一级黄片免费观看| 欧美日韩精品久久亚洲区熟妇人| 日韩成人动作片在线观看|