Struts2--動態Action的三種實現方法

最早使用動態方式調用是在spring中,沒想到Struts2也支持動態方法調用了,真是方便不少啊,呵呵,下面就來說說吧 :-)     

1.動態方法調用

       Struts2支持動態方法調用,它指的是一個Action中有多個方法,系統根據表單元素給定的action來訪問不同的方法,而不用寫多個Action

       使用動態方法調用前必須設置Struts2允許動態方法調用,它是通過設置

struts.enable.DynamicMethodInvocation = true來完成的。

       Struts2有多種方式實現動態方法調用(以下action請求的後綴均設置爲do(也可省略),而非默認的action)

 (1). 修改頁面Formaction請求方式

       將頁面上action的請求方式改爲:action = “ActionName!MethodName.do”,示例:

       Login.jsp

              ……

              var contextPath = “<%=request.getContextPath()%>”;

              <script type=”text/JavaScript”>

                     function dynamicMethodInvoke(){

                            document.forms[0].action = contextPath + “Login!dynamicMethod.do”;

                            document.forms[0].submit();

}

              </script>

              ……

              <input type=”button” value=”動態方法調用” οnclick=”dynamoicMethodInvoke()”/>

              ……

       當點擊“動態方法調用”按鈕時,執行dynamoicMethodInvoke方法,在此方法中修改提交的actionLogin!dynamicMethod.do,它的意思是將表單提交給Login ActiondynamicMethod方法進行處理。

       LoginAction.Java

       public class LoginAction {

       ……

       public String dynamicMethod() throws Exception{
                     ……

              return “success”;

}

 

public String execute() throws Exception{

       ……

       if (…){

              return “error”;

}

……

return “success”

}

}

 

       通過這種方式,可以在一個Action中包含多個方法,通過指定不同的action屬性來提交給Action的不同方法進行處理。

       對於使用動態方法調用的方法,它的聲明與系統默認的execute方法的方法聲明只有方法名不同,其他的如參數、返回值類型都必須相同。

 

 (2). 指定actionmethod屬性

       另一種動態調用方式是在struts.xml中指定actionmethod屬性,這樣可以讓Action類調用指定方法,而不是默認的execute方法來處理請求。示例:

       struts.xml

       ……

       <package name=”demo1” extends=”struts-default”>

              <action name=”Login” class=”com.demo.LoginAction” />

                     <result name=”input”>/input.jsp</result>

                     <result name=”error”>/error.jsp</result>

                     <result name=”success”>/success.jsp</result>

              </action>

              <action name=”Registry” class=”com.demo.LoginAction” method=”registry” />

                     <result name=”input”>/input.jsp</result>

                     <result name=”error”>/error.jsp</result>

                     <result name=”success”>/success.jsp</result>

              </action>

       </package>

       上述配置中兩個action的實現類均爲com.demo.LoginAction,他們的實現類雖然相同,但處理邏輯卻不同,處理邏輯通過method方法指定,其中名爲LoginAction對應的處理邏輯爲默認的execute方法,而名爲RegistryAction對應的處理邏輯則爲method指定的registry方法。

 

 (3). 使用通配符

       仔細看上面struts.xml中兩個action的定義,可以發現他們除了namemethod屬性不同以外,其餘的都一樣,這種定義相當的冗餘,爲了解決這種類型的問題,Struts2提供了通配符定義方式。

       在配置<action/>元素時,需要指定nameclassmethod等屬性,這3個屬性都支持通配符,在使用通配符定義Actionname屬性時,相當於一個元素action定義多個邏輯Action(2)中的action配置可以更改爲:

<package name=”demo” extends=”struts-default”>

       <action name=”*Action” class=”com.demo.LoginAction” method=”{1}”>

              <result name=”input”>/input.jsp</result>

              <result name=”error”>/error.jsp</result>

              <result name=”success”>/success.jsp</result>

       </action>

</package>

上述定義不是定義了一個普通的action,而是定義一系列的action,只要用戶請求的URL滿足*Action.do的模式,都可通過該Action進行處理,而method屬性使用了一個表達式{1},該表達式的值就是name屬性中第一個*的值,例如,用戶請求的URLLoginAction.do,則調用com.demo.LoginAction類的Login方法來處理,如果請示的URLRegistryAction.do的話,則調用com.demo.LoginActionRegistry方法進行處理。

 

以下配置在class屬性中使用通配符:

<package name=”demo” extends=”struts-default”>

       <action name=”*Action” class=”com.demo.{1}Action”>

              <result name=”input”>/input.jsp</result>

              <result name=”error”>/error.jsp</result>

              <result name=”success”>/success.jsp</result>

       </action>

</package>

       此配置中沒有指定method屬性,所以請示由默認的execute方式來執行,但class中使用了通配符,它的含義與上面一樣,例如,當用戶請求的爲LoginAction.do時,其中*的值爲Login,該值傳入class屬性,即該Action的處理類爲com.demo.LoginAction;而如果請求爲RegistryAction.do時,則該Action的處理類將變爲com.demo.RegistryAction

       Struts2允許在class屬性和method屬性中同時使用表達式,示例如下:

<action name=”*_*” class=”com.demo.{1} method=”{2}” />

不難看出,只要滿足*_*模式的Action都會被其處理,例如有Order_Booking.do請求到來,由於第一個*的值爲Order,第二個*的值爲Booking,那麼意味着將會調用com.demo.Order處理類中的Booking方法來處理用戶請求。

       Struts2除了允許在nameclassmethod中使用表達式外,在<result/>元素中也可以使用表達式,如下:

       <action name=”*Action” class=”com.demo.{1}Action method=”{1}” >

              <result name=”success”>/{1}.jsp</result>

       </action>

       當請求爲LoginAction.do時,將調用com.demo.LoginAction處理類中的Login方法處理用戶的請求,當返回爲success時,顯示/Login.jsp頁面。

       注意:在使用通配符後,除非請求的URLActionname屬性絕對相同,否則將按Actionstruts.xml中定義的先後順序來決定由哪個Action來處理用戶請求。

 

       對於一些只是簡單的轉發操作,如超級鏈接等的請求,可以定義name*Action來處理,此外,Struts2框架允許在struts.xml中使用<default-action-ref/>元素定義一個默認Action來處理用戶請求:

       <package name=”demo” extends=”struts-default” namespace=”/”>

              <action name=”defaultAction” class=”com.demo.DefaultAction”>

                     <result>/default.jsp</action>

</action>

<default-action-ref name=”defaultAction” />

       </package>

<default-action-ref/>name屬性爲struts.xml中一個已經定義好的Action

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章