Struts2中可以通過三種方式實現Dynamic Method Invocation
①method屬性
②頁面中指定
③使用萬用字元
第一種:在struts.xml的<action/>中指定method屬性
如果將<action/>中的method屬性設定為method="abc"的話,具體執行過程如下
如果一個<s:form action="login">,那麼就會產生LoginAction類的一個執行個體
接著就會由abc()方法來進行處理表單的請求,而不會自動的調用execute()方法了
而abc()與execute()的寫法是相同的,如public String abc() throws Exception {}
如果沒有method屬性,Struts2就會自動調用LoginAction的execute()方法
很顯然這裡使用到了Java的反射機制,否則也不可能通過方法名來調用方法
這就是在Struts2中通過一個Action來實現多個商務邏輯的方式,它完全對應Struts1.X中的DispatchAction
另外如果Action中僅僅存在doAbc()方法,而不存在abc()方法的話
那麼實際上Struts2仍會根據method="abc"去調用Action中的doAbc()方法
由於在Action中為方法命名時不允許使用關鍵字,所以Struts2為避免為method命名時而誤用關鍵字
所以提供了這種可以調用doXxx()方法的機制。這種機制僅供瞭解,無需深究
第二種:在頁面中指定調用Action類中的具體的方法
在前台頁面中設定成<s:form action="login!hello.action">
在struts.xml中為<action name="login" class="com.jadyer.action.LoginAction">
這樣當發送請求時,就會自動跳轉到LoginAction中,然後執行裡面的hello()方法
這種方式的作用與第一種設定method屬性的方式,最終實現的效果都是一樣的
第三種:使用萬用字元通過模糊比對的方式調用Action的方法
符號有三種,分別為 * ** /
其中 * 代表零個或多個字元,不包括"/"根
而 ** 代表零到多個字元,並且包括根
最後的 / 是轉義符。其中 * 用得最多
在struts.xml中設定為<action name="*User" class="...UserAction" method="{1}">
假設在前台頁面中設定成<s:form action="addUser">
執行時若沒有在struts.xml中找到名為addUser的<action/>的話,則會找到*User
這是一種模糊比對,匹配成功後,流程則進入名為*User的<action/>中,即UserAction
其中method的{1}對應 * 號,即此時將由UserAction中的add()方法執行addUser的請求
若寫成<result>/{1}UserSuc.jsp</result>,那麼執行add()成功後將轉到addUserSuc.jsp中
通常專案經理會指定方法命名規則,較常用的兩種方式為addUser和user_add
<action name="*_*" class="...{1}Action" method="{2}"><result>/{1}_{2}Suc.jsp</result></action>
另外可以使用{0}代表完整的*_*,即<result/>中可以用/{0}Suc.jsp代替/{1}_{2}Suc.jsp
這時前台頁面中就需要寫成類似於<a href="User_add.action">添加使用者</a>的樣式
注意User_add.action裡的User首字母必須大寫,因為它將來需要匹配UserAction類
其中{1}代表前面的星號,而{2}代表後面的星號
通常前面的星號代表資料表,後面的星號代表方法,當然具體由公司決定
也就是說,約定好項目中檔案的命名規範後,唯寫一個Action就能匹配N個表的N個方法