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