1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- /primer/helloWorldAction.action 7 package:包 8 * name:包名,唯一的,必選項 9 * namespace:命名空間,唯一的,相當於房間號。可選項,省略情況下是"/"。頁面中請求連接的前半部分 10 * extends:繼承 11 * extends="struts-default":struts2框架底層提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件 12 * 為什么要繼承這個struts-default.xml文件? 13 * 因為struts2框架底層提供的struts-default.xml聲明了所有的攔截器和攔截器棧, 14 知道在struts2框架運行時執行struts-default.xml文件中的攔截器棧。 15 * 如果不繼承struts-default.xml文件,就沒有辦法使用struts2框架提供的所有攔截器 16 --> 17 <package name="primer" namespace="/primer" extends="struts-default"> 18 19 <!-- 20 如果找不到對應的action名的時候,配置默認要執行的action 21 * name:指定action的名稱 22 --> 23 <default-action-ref name="helloWorldAction" /> 24 25 <!-- 26 action: 27 * name:對應頁面中請求連接的后面半部分 28 * class:對應要執行的類的完整路徑 29 --> 30 <action name="helloWorldAction" class="cn.yht.primer.HelloWorldAction"> 31 <!-- 32 result:結果類型 33 * name:對應的是執行的類的方法的返回值 34 public String execute() throws Exception { 35 System.out.println("HelloWorldAction ************* execute()"); 36 return "success"; 37 } 38 * 后半部分的文本內容:要轉向到的頁面 39 --> 40 <result name="success">/primer/success.jsp</result> 41 </action> 42 <!-- 43 沒有為action指定class 44 * 在struts2框架底層的struts-default.xml文件中,配置了默認執行的類 45 com.opensymphony.xwork2.ActionSupport 46 public String execute() throws Exception { 47 return SUCCESS; 48 } 49 * 實際上,默認執行的是底層提供的ActionSupport類的execute()方法 50 * result結果類型,默認是根據struts2框架底層提供的ActionSupport類的execute()方法返回值,進行跳轉 51 --> 52 <action name="actionNoClass"> 53 <result name="success">/primer/success.jsp</result> 54 </action> 55 </package> 56 </struts>
為Action配置method屬性:
將Action類中的每一個處理方法都定義成一個邏輯Action方法。
1 <!DOCTYPE struts PUBLIC 2 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 5 "http://struts.apache.org/dtds/struts-2.0.dtd"> 6 7 <struts> 8 9 <package name="my" extends="struts-default" namespace="/manage"> 10 11 <action name="userLogin" class="org.qiujy.web.struts2.action.LoginAction" method="login"> 12 13 <result name="success">/success.jsp</result> 14 15 <result name="error">/error.jsp</result> 16 17 </action> 18 19 20 21 <action name="userRegist" class="org.qiujy.web.struts2.action.LoginAction" method="regist"> 22 23 <result name="success">/success.jsp</result> 24 25 <result name="error">/error.jsp</result> 26 27 </action> 28 29 </package> 30 31 </struts>
如上,把LoginAction中的login和regist方法都配置成邏輯Action。要調用login方法,則相應的把index.jsp中表單元素的action設置為"manage/userLogin.action";要調用regist方法,把regist.jsp中表單元素的action設置為"manage/userRegist.action"。
3.3. 使用通配符映射(wildcard mappings)方式:
在struts.xml文件中配置<action…>元素時,它的name、class、method屬性都可支持通配符,這種通配符的方式是另一種形式的動態方法調用。
當我們使用通配符定義Action的name屬性時,相當於用一個元素action定義了多個邏輯Action:
<action name="user_*" class="org.qiujy.web.struts2.action.UserAction" method="{1}"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> {1}為配置參數,意思為如: user_*時,則執行時,使用的是方法*, user_a時,則執行時,使用的是方法a。
如上,<action name=”user_*”>定義一系列請求URL是user_*.action模式的邏輯Action。同時method屬性值為一個表達式{1},表示它的值是name屬性值中第一個*的值。例如:用戶請求URL為user_login.action時,將調用到UserAction類的login方法;用戶請求URL為user_regist.action時,將調用到UserAction類的regist方法。
4. 處理結果
Struts2的Action處理完用戶請求后,將返回一個普通字符串,整個普通字符串就是一個邏輯視圖名。Struts2通過配置邏輯視圖名和物理視圖資源之間的映射關系,一旦系統收到Action返回的某個邏輯視圖名,系統就會把對應的物理視圖資源呈現給瀏覽者。
4.1. 配置處理結果:
Struts2的Action處理用戶請求結束后,返回一個普通字符串-邏輯視圖名,必須在struts.xml文件中完成邏輯視圖和物理視圖資源的映射,才可讓系統轉到實際的視圖資源。
Struts2通過在struts.xml文件中使用<result …/>元素來配置結果。Struts2提供了兩種結果。
l 局部結果:將<result …/>作為<action …>元素的子元素配置。
l 全局結果:將<result …/>作為<global-results …>元素的子元素配置。
在package元素中配置<global-results>子元素:
<global-results> <result name="error">/Error.jsp</result> <result name="invalid.token">/Error.jsp</result> <result name="login" type="redirect-action">Logon!input</result> </global-results>
全局result(global-results)
有很多時候一個<result>可供很多<action>使用,這時可以使用<global-results>標簽來定義全局的<result>l。執行順序:當一個Action返回的String沒有相應的<result>與之對應,Struts2就會查找全局的<result>。
