Struts2之一个Action包含多个控制处理逻辑
http://www.cnblogs.com/freeabyss/p/3290297.html
一、使用Action的動(dòng)態(tài)方法調(diào)用
??? 如果一個(gè)頁(yè)面包含多個(gè)按鈕,系統(tǒng)分別提交給Action的不同方法處理.此時(shí)可以采用DMI(Dynamic Method Invocation,動(dòng)態(tài)方法調(diào)用)來(lái)處理這種請(qǐng)求。動(dòng)態(tài)方法調(diào)用是指表單元素的Action并不是直接等于某個(gè)Action名字,而且以如下形式指定表單的Action屬性:
?| 1 2 3 | <!-- action屬性為actionNmae!methodName的形式 其中ActionName指定提交到哪個(gè)Action,而methodName指定提交到指定方法--> action="ActionName!methodName" |
?
其中一個(gè)按鈕的代碼如下:
<input type="submit" value="注冊(cè)" οnclick="regist();" />上述代碼中指定“注冊(cè)”按鈕被單擊時(shí)觸發(fā)regist函數(shù),該函數(shù)的代碼如下:
<script type="text/javascript"> function regist(){targetForm = document.forms[0];targetForm.action = "login!regist"; } </script>?
上述JavaScript代碼改變了表單元素的Action屬性,修改后的屬性為login!regist,其實(shí)質(zhì)就是將該表單提交給login Action的regist方法處理。
struts.xm中的配置:
<package name="lee" extends="struts-default"><action name="login" class="org.crazyit.app.action.LoginAction"><!-- 定義三個(gè)邏輯視圖和物理資源之間的映射 --><result name="error">/error.jsp</result><result name="success">/welcome.jsp</result></action> </package>?
注意:使用動(dòng)態(tài)方法調(diào)用前,必須設(shè)置Struts2允許動(dòng)態(tài)方法調(diào)用,需要設(shè)置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>?
???? 對(duì)應(yīng)的javaScript代碼為:
?
function regist(){targetForm = document.forms[0];targetForm.action = "regist"; }?
??? 2)使用通配符
在上述的struts.xml文件中,兩個(gè)Action定義絕大部分相同,可見這種定義相當(dāng)冗余,為了解決這個(gè)問(wèn)題,Struts2可以使用通配符。
在配置<action ../>時(shí),允許在指定name屬性時(shí)使用通配符,然后在class、method屬性及<result…/>子元素中使用{N}的形式來(lái)代表前面第N個(gè)星號(hào)所匹配的子串。
示例一:
<action name="*Action" class="org.crazyit.app.action.LoginAction" method="{1}"><result name="error">/error.jsp</result><result name="success">/welcome.jsp</result> </action>?
例如,如果請(qǐng)求URL為loginAction.action,則調(diào)用LoginAction類的login方法,如果請(qǐng)求URL為registAction.action,則調(diào)用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>?
例如,如果請(qǐng)求URL為Book_save.action,則對(duì)應(yīng)的處理類為BookAction,處理方法為save方法。
??? 3)對(duì)子元素使用通配符
Struts2不僅允許在class屬性、name屬性中使用表達(dá)式,還可以在<result…/>子元素中使用{N}表達(dá)式。
<action name="*" ><result>/{1}.jsp</result> </action>?
上面的Action的定義可以匹配任意的Action,所用的用戶請(qǐng)求都可通過(guò)Action來(lái)處理,因?yàn)闆]有指定class屬性,該Action使用ActionSupport來(lái)作為處理類,而且因?yàn)樵揂ctionSupport類的execute方法返回success字符串, 即該Action總是直接返回result中指定的JSP資源,JSP資源使用表達(dá)式來(lái)生成資源名。上面Action定義的含義是如果請(qǐng)求a.aciton,則進(jìn)入a.jsp頁(yè)面;如果請(qǐng)求b.action,則進(jìn)入b.jsp頁(yè)面……
通過(guò)這種方式,可以避免讓瀏覽者直接訪問(wèn)系統(tǒng)的JSP頁(yè)面,而是讓Struts2框架來(lái)管理所有用戶請(qǐng)求。
對(duì)于使用Struts2框架的應(yīng)用而言,盡量不要讓超級(jí)鏈接直接連接到某個(gè)視圖資源,因?yàn)檫@種方式增加了額外的風(fēng)險(xiǎn)。推薦將所有請(qǐng)求都發(fā)送給Struts2框架,讓框架來(lái)處理用戶請(qǐng)求,即使只是簡(jiǎn)單的超級(jí)鏈接。
??? 4)關(guān)于因通配符帶來(lái)的優(yōu)先級(jí)的問(wèn)題。
假設(shè)有URL為abcAction.action的請(qǐng)求,在struts.xml文件中配置了如下三個(gè)Action,它們的name的值分別為:abcAction、*Action和*,則這個(gè)請(qǐng)求將會(huì)被名為abcAction的Action處理。
假設(shè)有URL為defAction.action的請(qǐng)求,在struts.xml文件中配置了如下三個(gè)Action,它們的name的值分別為:abcAction、*Action和*,則*Action不會(huì)比*更優(yōu)先匹配defAction.action的請(qǐng)求,而是先找到那個(gè)Action,就會(huì)由那個(gè)Action來(lái)處理用戶請(qǐng)求。
?
總結(jié)
以上是生活随笔為你收集整理的Struts2之一个Action包含多个控制处理逻辑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Struts2配置文件中传递参数的一个小
- 下一篇: OGNL表达式struts2标签“%,#