(二)Struts.xml文件詳解


一、Struts.xml文件

  •    Struts.xml文件構成

如圖,《Struts》標簽內共有5個子標簽。

  

  1.1  struts-default.xml

  •  查看Struts的內容可知,Struts的默認包“default”是繼承於"Struts-dafault"包的,struts-default包是在struts-default.xml中定義,struts-default.xml也是Struts2默認配置文件,所以Struts2每次都會自動加載 struts-default.xml文件。
  •   struts-default.xml 里定義了一大堆的常量和bean,要使用這些只需要繼承這個包就行了。

  • struts-default.xml路徑:struts2-core-2.3.32.jar/struts-default.xml

 

  1.2 子標簽之bean (暫時無須理會)

  

  1.3 子標簽之constant

  A、 Struts所有常量定義在:

 

  B、 常用常量:

struts.i18n.encoding=UTF-8                //設置請求的編碼
    struts.enable.DynamicMethodInvocation = true        //是否支持動態方法的調用
    struts.configuration.xml.reload = true            //是否支持XML的自動加載
    struts.devMode = false                    //開發模式
    struts.ui.theme=xhtml                    //UI模板的設置
    struts.ognl.allowStaticMethodAccess=false        //是否允許在ONGL表達式中調用靜態方法
    struts.action.extension=action,,            //STruts請求的擴展名。

  C、常量定義位置

  • 常量可以定義在4個位置:

    A、第一個就是defalut.properties里,但是我們一般都不會在這個文件里定義常量。

    B、第二個就是struts.xml中,

<struts>
	
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
  	 <action name="xx" class="com.ActionFirst">
  	 <result name="index">/index.jsp</result>
  	 </action>
       </package>

</struts>

    C、第三個就是

  • 這個文件需手工建立,也是放在src目錄下,一般用於WebWork工程

    D、第四個就是在web.xml

   <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
   <init-param>
       <param-name>struts.devMode</param-name>
       <param-value>true</param-value>
   </init-param>
   
    </filter>
  • struts讀取常量的順序:后面的會覆蓋前面的配置。就是說web.xml中配置的struts.devMode的值會覆蓋掉前面ABC配置的值。

 

  1.4  子標簽之include

  •   包含其他配置文件,一般用於團隊合作。

  struts中多模塊的設置,模塊化文件。
        <include file="xxxx.xml"/>
        公用的Action放在struts.xml中,模板的配置放到模板的配置文件中。

 

 1.5  子標簽之package   

  1.5.1 屬性

 

  屬性A、   name="default"                包名,隨便取,不能重復。

 

  屬性B、   namespace="/"                命名空間。

    命名空間:
    struts請求的訪問路徑:
    http://IP地址:端口號/工程名/命名空間/Action的名稱。    
    
    struts會根據命名空間逐層進行匹配。
    <a href="<%=path%>/aa/bb/cc/dd/nameSpaceAction">命名空間示例</a>

    •         示例:

      A. 編寫index.html

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <%
 6 String path = request.getContextPath();
 7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 8 %>
 9 <head>
10 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
11 <title>Insert title here</title>
12 </head>
13 <body>
14     <a href="<%=path%>/aa/bb/exam"> 命名空間示例</a>
15 </body>
16 </html>
  •  a標簽跳轉到“工程名/aa/bb/exam”URL,

    B、編寫action類

 1 package com;
 2 
 3 public class ActionFirst {
 4     /**
 5      * 必須要有String的execute方法
 6      * @return
 7      */
 8     public String execute(){        
 9     
10         return "index";    
11     }
12 }

    C、配置struts.xml文件

 1 <struts>
 2     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
 3     <constant name="struts.devMode" value="true" />
 4     
 5     <package name="default" namespace="/" extends="struts-default">
 6        <action name="xx" class="com.ActionFirst">
 7        <result name="index">/index.jsp</result>
 8        </action>
 9        </package>
10        
11        <package name="aa" namespace="/aa" extends="struts-default">
12            <action name="exam" class="com.ActionFirst">
13                <result name="index">/index_2.jsp</result>
14            </action>
15        </package>
16        
17 
18 </struts>

    D、編寫跳轉后的index_2.jsp頁面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     我是跳轉后的jsp頁面
11     
12 </body>
13 </html>

結果:

點擊a標簽跳轉到:

查看地址欄“http://localhost:8080/struts_project_1/aa/bb/exam” 說明跳轉成功,但是在struts.xml文件如下配置,並沒有“/aa/bb”這個命名空間,正常來說,地址欄的URL 為“http://localhost:8080/struts_project_1/aa/exam” 才能跳轉成功,但是還是跳轉成功了,|struts的匹配規則為: struts會根據命名空間逐層進行匹配。
以本例來說,當URL為“/aa/bb”找不到action=exam時,就會到上一層命名空間“/aa”里找action=exam ,就這樣一層一層往上找。

 <package name="aa" namespace="/aa" extends="struts-default">
           <action name="exam" class="com.ActionFirst">
               <result name="index">/index_2.jsp</result>
           </action>
       </package>

 

 

    屬性C、    extends="struts-default"        包之間的繼承。就可以父包配置的選項

                            默認所有的package都繼承struts-default.xml

    屬性D、    abstract="true|false"            是否抽象包。抽象包中不能定義action。

 

    1.5.2  package的子標簽

 

         1.5.2.1  package子標簽之action標簽

 

   <action  name=""  class=""  method="">     

  示范:  <action name="methodAction" class="com.action.MethodAction" method="test"></action> 

        解析:訪問methodAction路徑,默認執行execute方法。通過method屬性的配置,可以執行其他的方法。示例中就是執行test方法。

  值得注意到是 method里的方法只能是public訪問修飾符,而不能是其它修飾符,可以在這個public方法里調用其他非public的方法。

      

         1.5.2.2  action標簽的子標簽《param》
  • action中的param

    設置或者獲取Action中定義的成員變量的值。要求成員變量要有SET與GET方法。本文中只示范設置成員變量,而獲取在后續章節再詳細講解。

示例(設置Action中定義的成員變量的值):

index.jsp:

<body>
    <a href="<%=path%>/aa/exam"> action中param標簽使用示例</a>
</body>

ActionFirst.java:

package com;

public class ActionFirst {
    /**
     * 使用action中的param標簽前提是action的成員變量必須有get和set方法。
     * 
     */
    private String userName;
    
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String execute(){        
    System.out.println(this.userName); //在控制台輸出Action成員變量的值 return "index_2";    
    }
}

struts.xml:

 <package name="aa" namespace="/aa" extends="struts-default">
           <action name="exam" class="com.ActionFirst">
               <param name="userName">用戶名</param>
               <result name="index_2">/index_2.jsp</result>
           </action>
       </package>

結果:

點擊標簽之后:

 

 

        1.5.2.2  action標簽的子標簽《result》

  •  action中的result
       屬性A、 name:result的名稱
       屬性B、type:result的類型,
            chain:                    請求轉發到Action
            dispatcher:                請求轉發到JSP面,默認
            redirect:                重定向到JSP頁面
            redirectAction:            重定向到Action
            stream:                流方式,用於下載

         freemarker              freemarker模版引擎 (了解即可)  

示例:  以上題為例:

 <package name="aa" namespace="/aa" extends="struts-default">
           <action name="exam" class="com.ActionFirst">
               <param name="userName">用戶名</param>
               <result name="index_2">/index_2.jsp</result>
           </action>
       </package>
  •  struts.xml中<result name="index_2">/index_2.jsp</result> ,當訪問URL"工程名/aa/exam"時,ActionFirst 這個 Action 的execute方法的返回值為index_2時,將跳轉到index_2.jsp這個jsp。

    type類型如果沒有寫,默認是dispatcher ,即<result name="index_2" type="dispatcher">/index_2.jsp</result>

  • type="chain" 使用示例:
       <package name="aa" namespace="/aa" extends="struts-default">
           <action name="exam" class="com.ActionFirst">
               <result name="index_2" type="chain">
                   <param name="namespace">/bb</param>
                   <param name="ActionName">ChainAction</param>
               </result>
           </action>
       </package>
    
    <package name="bb" namespace="/bb" extends="struts-default">
             <action name="ChainAction" class="com.ChainAction">    
             </action>
         </package>

 解析: 當我們訪問url"工程名/aa/exam" 的時候,會調用com.ActionFirst 這個類的execute方法,然后返回一個String值"index_2" ,由於這個result是chain類型的(請求轉發到Action), 所以會找到<param name="namespace">/bb</param>  命名空間為"/bb"中的 <param name="ActionName">ChainAction</param> Action名叫“ChainAction”的類並執行,調用那個的execute方法,並返回String值。  注意:  name="namespace"name="ActionName"  值不能寫錯,但是不區分大小寫,ActionName與actionname是一樣的。

 

  • type="redirect" 使用示例
 <package name="aa" namespace="/aa" extends="struts-default">
           <action name="exam" class="com.ActionFirst">
               <result name="redict_index_2" type="redirect">/index_2.jsp</result>
           </action>
       </package>

 

  • type="redirectAction" 重定向到Action 用法與type="chain" 相同

 

  • type="freemarker" 使用示例:
       <package name="aa" namespace="/aa" extends="struts-default">
           <action name="exam" class="com.ActionFirst">
              <param name="userName">admin</param>
               <result name="freemarker_index_2" type="freemarker">/cc.ftl</result>
           </action>
       </package>

解析: 當地址欄為"工程名/aa/exam"時, 調用com.ActionFirst ,然后調用execute方法,給這個類的成員變量賦值(<param name="userName">admin</param>), 最后execute方法返回String值=freemarker_index_2, 跳轉到/cc.ftl 里。

 cc.ftl:

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
            ${userName}
</body>
</html>

 ${} 這是ftl文件的表達式,用於獲取值。

結果:

如圖可見,在Struts.xml設置的userName=admin成功在cc.ftl文件里獲取。

 

 

     1.5.3  package子標簽之《default-action-ref》標簽

  •  配置默認的action。

    當鏈接到一個命名空間時,沒有指定action的路徑,那么就會執行默認的action。

    http://localhost:8080/Struts2_Project_1/test1/

    <package name="test" namespace="/test1" extends="struts-default">
            <default-action-ref name="index" />
            <action name="index">
                <result>/main.jsp</result>
            </action>

    </package>

 示例:

struts.xml

<struts>
    <package name="default" namespace="/" extends="struts-default">
       <default-action-ref name="xx"></default-action-ref>
       <action name="xx" class="com.ActionFirst">
           <result name="index_2">/index_2.jsp</result>
       </action>
       
      </package>       
</struts>  

 index_2.jsp

<body>
    我是重定向后的頁面
</body>

注意:  1.  請把(項目名/index.jsp)中的index.jsp這個文件去掉,否則web服務器會自動跳轉到index.jsp頁面。

      2.  <default-action-ref name="xx"></default-action-ref> 這個標簽請放在《package》標簽中的第一行,否則報錯。

 結果:

解析: 當url為“項目名/”/為命名空間,此時在地址欄里沒有輸入任何action的名,所以無法執行Action,默認執行<default-action-ref name="xx"></default-action-ref> 中的名叫“xx”的action。 於是出現上圖。

 

 

    1.5.4  package子標簽之《global-results》標簽

  • 是Package下面所有的action都可以調用global中定義的result.
  • global-results與results的區別:

    global-result:是Package下面所有的action都可以調用global中定義的result.

    result:是action中私用的。

    其它的package想要調用另一個package中定義的global-result時,直接將包做

    繼承關系即可。通過extend來繼承。

    <package name="aa" namespace="/aa" extends="default">

  • 《global-results》標簽適用於錯誤頁面、版權頁面等通用的頁面。

示例:

Struts.xml

<package name="aa" namespace="/aa" extends="struts-default">
          <global-results >
            <result name="error">/page_error.jsp</result>
        </global-results>
        
           <action name="exam" class="com.ActionFirst">
               <result name="index_2">/index_2.jsp</result>
           </action>
       </package>

ActionFirst.java

package com;

public class ActionFirst {
    /**
     * 使用action中的param標簽前提是action的成員變量必須有get和set方法。
     * 
     */
    private String userName;
    
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String execute(){
        String a=null;
        
        if(a!=null && !a.equals(""))
        
            return "index_2";    
        else
            return "error";
        
    }
}

 解析:當地址欄為“項目名/aa/exam”時,執行ActionFirst的execute方法,返回String=“error” ,然后名叫exam的這個action中並沒有名叫error的result,但是仍舊可以使用,因為這個errror定義在<global-results > 里,本包中的所有action都可以使用,而不必在《result》中定義。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM