【學習筆記】Struts2之一個Action包含多個控制處理邏輯


一、使用Action的動態方法調用

    如果一個頁面包含多個按鈕,系統分別提交給Action的不同方法處理.此時可以采用DMI(Dynamic Method Invocation,動態方法調用)來處理這種請求。動態方法調用是指表單元素的Action並不是直接等於某個Action名字,而且以如下形式指定表單的Action屬性:

<!-- action屬性為actionNmae!methodName的形式
其中ActionName指定提交到哪個Action,而methodName指定提交到指定方法-->
action="ActionName!methodName"

 

其中一個按鈕的代碼如下:

<input type="submit" value="注冊" onclick="regist();" />

上述代碼中指定“注冊”按鈕被單擊時觸發regist函數,該函數的代碼如下:

<script type="text/javascript">
function regist(){
	targetForm = document.forms[0];
	targetForm.action = "login!regist";
}
</script>

 

上述JavaScript代碼改變了表單元素的Action屬性,修改后的屬性為login!regist,其實質就是將該表單提交給login Action的regist方法處理。

struts.xm中的配置:

<package name="lee" extends="struts-default">
	<action name="login" class="org.crazyit.app.action.LoginAction">
		<!-- 定義三個邏輯視圖和物理資源之間的映射 -->
		<result name="error">/error.jsp</result>
		<result name="success">/welcome.jsp</result>
	</action>
</package>

 

注意:使用動態方法調用前,必須設置Struts2允許動態方法調用,需要設置struts.enable.DyanmicMethodInvocation常量為true。

二、指定method屬性及使用通配符

    1)使用method屬性

<action name="login" class="org.crazyit.app.action.LoginAction" method="execute">
	<result name="error">/error.jsp</result>
	<result name="success">/welcome.jsp</result>
</action>
<action name="regist" class="org.crazyit.app.action.LoginAction" method="regist">
	<result name="error">/error.jsp</result>
	<result name="success">/welcome.jsp</result>
</action>

 

     對應的javaScript代碼為:

 

function regist(){
	targetForm = document.forms[0];
	targetForm.action = "regist";
}

 

    2)使用通配符

在上述的struts.xml文件中,兩個Action定義絕大部分相同,可見這種定義相當冗余,為了解決這個問題,Struts2可以使用通配符。

在配置<action ../>時,允許在指定name屬性時使用通配符,然后在class、method屬性及<result…/>子元素中使用{N}的形式來代表前面第N個星號所匹配的子串。

示例一:

<action name="*Action" class="org.crazyit.app.action.LoginAction" method="{1}">
	<result name="error">/error.jsp</result>
	<result name="success">/welcome.jsp</result>
</action>

 

例如,如果請求URL為loginAction.action,則調用LoginAction類的login方法,如果請求URL為registAction.action,則調用LoginAction類的regist方法。

示例二:

<action name="*_*" class="org.crazyit.app.action.{1}Action" method="{2}">
	<result name="error">/error.jsp</result>
	<result name="success">/welcome.jsp</result>
</action>

 

例如,如果請求URL為Book_save.action,則對應的處理類為BookAction,處理方法為save方法。

    3)對子元素使用通配符

Struts2不僅允許在class屬性、name屬性中使用表達式,還可以在<result…/>子元素中使用{N}表達式。

<action name="*" >
	<result>/{1}.jsp</result>
</action>

 

上面的Action的定義可以匹配任意的Action,所用的用戶請求都可通過Action來處理,因為沒有指定class屬性,該Action使用ActionSupport來作為處理類,而且因為該ActionSupport類的execute方法返回success字符串, 即該Action總是直接返回result中指定的JSP資源,JSP資源使用表達式來生成資源名。上面Action定義的含義是如果請求a.aciton,則進入a.jsp頁面;如果請求b.action,則進入b.jsp頁面……

通過這種方式,可以避免讓瀏覽者直接訪問系統的JSP頁面,而是讓Struts2框架來管理所有用戶請求。

對於使用Struts2框架的應用而言,盡量不要讓超級鏈接直接連接到某個視圖資源,因為這種方式增加了額外的風險。推薦將所有請求都發送給Struts2框架,讓框架來處理用戶請求,即使只是簡單的超級鏈接。

    4)關於因通配符帶來的優先級的問題。

假設有URL為abcAction.action的請求,在struts.xml文件中配置了如下三個Action,它們的name的值分別為:abcAction、*Action和*,則這個請求將會被名為abcAction的Action處理。

假設有URL為defAction.action的請求,在struts.xml文件中配置了如下三個Action,它們的name的值分別為:abcAction、*Action和*,則*Action不會比*更優先匹配defAction.action的請求,而是先找到那個Action,就會由那個Action來處理用戶請求。


免責聲明!

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



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