Struts2配置詳解_配置Action

Struts2的核心功能是action,對於開發人員來說,使用Struts2主要就是編寫action,action類通常都要實現com.opensymphony.xwork2.Action接口,並實現該接口中的execute()方法。

該方法如下:

   public String execute() throws Exception

Struts2並不是要求所有編寫的action類都要實現Action接口,也可以直接編寫一個普通的Java類作爲action,只要實現一個返回類型爲String的無參的public方法即可:

    public String  xxx()

在實際開發中,action類很少直接實現Action接口,通常都是從com.opensymphony.xwork2.ActionSupport類繼承,ActionSupport實現了Action接口和其他一些可選的接口,提供了輸入驗證,錯誤信息存取,以及國際化的支持,選擇從ActionSupport繼承,可以簡化action的定義。

開發好action之後,好需要對action進行配置,以告訴Struts2框架,針對某個URL的請求應該交由哪個action進行處理。

 

1.    Action映射:
  action
映射是Struts2框架中的基本 工作單元action映射就是將一個請求URL(action的名字)映射到一個action類,當一個請求匹配某個action的名字時,框架就使用這個映射來確定如何處理請求。
                   action
元素的完整屬性表

屬性

是否必須

說明

name

action的名字,用於匹配URL

class

Action實現類的完整類名

method

執行Action類時調用的方法

convert

應用於action的類型轉換的完整類名



 

 

 

 

       例如:
<action name="user" class="org.lesson05.UserAction">

                <result name="success">/user.jsp</result>

        </action>

    2. 使用method屬性
           在配置action時,我們可以通過action元素的method屬性來指定action調用的
       
 方法,所指定的方法,必須遵循與execute方法相同的格式。
          
 Struts2.xml文件中,我們可以爲同一個action類配置不同的別名,並使用
        method
屬性。
          
 Struts.xml文件中爲同一個Action類配置不同的別名
            
<!-- 使用method屬性 -->

<package name="methods" namespace="/"

extends="struts-default">

        <!-- 對應着MethodAction裏面的execute方法 -->

        <action name="list" class="org.lesson05.MethodAction">

            <result name="success">/Methods/list.jsp</result>

        </action>

        <!-- 對應着MethodAction裏面的add方法 -->

        <action name="add" class="org.lesson05.MethodAction"

method="add">

            <result name="success">/Methods/add.jsp</result>

        </action>

        <!-- 對應着MethodAction裏面的edit方法 -->

        <action name="edit" class="org.lesson05.MethodAction"

method="edit">

            <result name="success">/Methods/edit.jsp</result>

        </action>

        <!-- 對應着MethodAction裏面的delete方法 -->

        <action name="delete"

class="org.lesson05.MethodAction"

 method="delete">

            <result name="success">/Methods/delete.jsp</result>

        </action>

</package>

對應的MethodAction類,代碼如下:
            
importcom.opensymphony.xwork2.ActionSupport;

public class MethodAction extends ActionSupport

{

 

    @Override

    public String execute() throws Exception

    {

       return SUCCESS;

    }

   

    public String add() throws Exception

    {

       return SUCCESS;

    }

   

    public String edit() throws Exception

    {

       return SUCCESS;

    }

   

    public String delete() throws Exception

    {

       return SUCCESS;

    }

}

           使用actionmethod屬性可以任意指定處理請求的方法(只要該方法和execute

方法具有相同的格式),這樣就可以在同一個類中完成相關的任務,而不需要去編寫不

同的Action類。

           注意:Struts2在根據action元素的method屬性查找方法時有兩種途徑:

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

   3.動態方法調用:

         另外一種無需配置就可以直接調用Action中的非execute方法的方式,是使用

Struts2的動態方法調用。

   動態方法調用是在action的名字中使用感嘆號(!)來標識要調用的方法名,其語法格

式爲 actionName!methodName.action

   例如,我們配置瞭如下的action

   <action name="user" class="org.lesson05.UserAction">

            <result name="success">/Methods/list.jsp</result>

   </action>

          當請求/user!delete.action時,就會自動調用UserAction中的delete()

提示,這種調用方式會帶來安全隱患!

 

4模擬Struts1中的ForwardAction
             <action name="user">

       <result>/index.jsp</result>

              </action>

      這樣寫就可以了.

 

   5.默認的action

         如果請求一個不存在的action,結果將是HTTP404錯誤。在Struts2中,可以指定一個默認的action,如果一個請求沒有其他的action匹配,那麼默認的action將被執行。

         默認的action使用default-action-ref元素來聲明,如下所示:

          <!-- 默認action -->

<package name="defaultAction" namespace="/default"

extends="struts-default">

        <default-action-ref name="error"></default-action-ref>    

        <action name="defaultaction"

class="org.lesson05.DefaultAction">

            <result name="success">/defaultAction.jsp</result>

        </action>

        <action name="error">

            <result>/error.jsp</result>

        </action>

    </package>

   注意:根據struts-2.0.dtd中定義的package元素的內容模型,

default-acion-ref必須在action元素之前使用。

   如果請求的是/default/defaultaction1.action,框架找不到映射到defaultaction1action,那麼名爲erroraction將被調用。

    注意:每個包中都可以有它自己默認的action,但是每一個名稱空間應該只有一個默認action。如果具有相同名稱空間的多個包中都聲明瞭默認action,那麼哪一個action纔是默認的將無法保證。

    注意:默認action只對action的訪問有效。如果你訪問一個非action的資源,例如/user.jsp,而該頁面不存在,這時仍會看到HTTP404錯誤。如果想爲整個Web應用程序指定默認頁面,需要在web.xml文件中對HTTP404錯誤指定相應的錯誤處理頁面。

 

6.通配符映射

      隨着Web應用程序的增加,所需的Action也會更多,從而導致大量的action映射,使用通配符可以減少action配置的數量,使一些具有類似行爲的Action或者Action方法可以使用通用的樣式來配置。

      通配符即星號(*),用於匹配0個或多個字符,在配置action時,可以在action元素的name屬性中使用星號(*)來匹配任意的字符。

             以下是在action映射中使用通配符:
              
 <action name="news*"          

class="org.struts2.lesson05.News{1}Action">

                    <result name="success">/WEB-INF/News/{1}.jsp</result>

        </action>

      我們在action元素的name屬性中使用了通配符(*),允許這個映射匹配所有以/news開始的URL,例如/newsAdd,/newsEdit,/newsDelete,但是,如果請求的是/newsEdit/add,那麼這個映射就不會被匹配。

      在上面,有一個特殊的記號{1},這是作爲佔位符使用的,它將被通配符所匹配的值替換,例如訪問/newsEdit,通配符(*)匹配的部分是Edit,那麼,這個值將替換{1},最終調用的類是org.struts2.lesson05.NewsEditAction,Action

   執行成功後導向的結果頁面是/WEB-INF/News/Edit.jsp

      action映射和action結果中,通配符匹配的值可以用記號{N}來訪問,N是從19的數字,指出替換的是哪一個通配符匹配的值。整個請求URL可以用記號{0}來訪問。例如如下的action映射:
    
 <action name="*_*" class="org.struts2.lesson05.{1}Action"  

method="{2}">

            <result>/WEB-INF/News/{0}.jsp</result>

        </action>

      當訪問/News_delete時,name屬性中的第一個”*”匹配News,第二個”*”匹配deleteclass屬性中使用的記號是{1},所以被News所替換,method屬性中使用的記號是{2},於是被delete所替換。結果映射中使用的記號是{0},於是被整個URL替換,即News_delete所替換。整個替換後的結果是:當請求/News_delete時,框架調用NewsAction實例的delete方法對請求進行處理。執行成功後,請求被導向到/WEB-INF/News/News_delete.jsp頁面。

      通配符方法設置的另一種常見方式是使用後綴通配符,即將”*”放在action名字的後面,在”*”和名字前綴之間使用一個特殊字符作爲分隔,常用的特殊字符是下劃線(_),當然也可以使用其他字符。例如:

               <action name="News_*"

class="org.struts2.lesson05.NewsAction" method="{1}">

                    <result>/WEB-INF/News/{0}.jsp</result>

        </action>

       當請求/News_delete時,調用的是NewsAction實例的delete方法,當請求/News_edit的時候,調用的是NewsAction實例的edit方法。

發佈了97 篇原創文章 · 獲贊 33 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章