Struts2中的动态方法调用和使用通配符定义action
转自:http://keveon.iteye.com/blog/998159
struts2中的动态方法调用(Dynamic method Invoc)
????? struts2中无需配置就可以直接调用Action中非execute方法的方式,就是用struts2的动态方法调用。动态方法调用是在action的名字中使用感叹号(!)来标示要调用的方法名,其语法格式为actionName!methodname.action,例如我们的struts.xml的配置如下:?
Xml代码??
- <struts>????????
- ????<package?name="struts"?namespace="/user"?extends="struts-default">??
- ????????<action?name="user"?class="com.struts.action.UserAction">??
- ????????????<result?name="success">/WEB-INF/page/message.jsp</result>??
- ????????</action>??
- ????</package>??????????????
- </struts>????
action中的有如下方法:
Java代码??
- public?String?addUser()?{??
- ????this.message?=?"addUser";??
- ????return?"success";??
- }??
- ??
- public?String?deleteUser()?{??
- ????this.message?=?"deleteUser";??
- ????return?"success";??
- }??
当请求/user!addUser.action时,将调用UserAction的addUser()方法,当请求/user!deleteUser.action时,将调用UserAction的deleteUser()方法。
如果要禁用动态方法调用,则可以在struts.xml配置如下常量

- <constant?name="struts.enable.DynamicMethodInvocation"?value="false"?/>???
value的默认值为true。
?
使用通配符定义action
使用通配符..其中的好处就是可以大大减少了配置文件的内容,下面举个例子:
struts.xml中的配置如下:
Xml代码??
- <struts>????????
- ????<package?name="struts"?namespace="/user"?extends="struts-default">??
- ????????<action?name="user_*"?class="com.struts.action.UserAction"?method="{1}">??
- ????????????<result?name="success">/WEB-INF/page/message.jsp</result>??
- ????????</action>??
- ????</package>??????????????
- </struts>??
user_*中的*就是通配符,表示的是可以匹配任意字符,method="{1}"中的{1}就表示的就是*的内容,当然也可以用多个*,比如"*_*", "*_*_*",不过建议不要使用太多的*,这样会降低代码的可读性
?
?action中的方法:
Java代码??
- public?String?addUser()?{??
- ????this.message?=?"addUser";??
- ????return?"success";??
- }??
- ??
- public?String?deleteUser()?{??
- ????this.message?=?"deleteUser";??
- ????return?"success";??
- }??
?当请求/user_addUser.action时,将调用UserAction的addUser()方法,当请求/user_deleteUser.action时,将调用UserAction的deleteUser()方法。
?
?
关于通配符匹配的优先权:
(1)如果struts.xml里面有对应的action name ,就算它有其他通配符匹配的,都优先对应完全相同的。
比如 有一个 action name 是 "user_add"? 还有一个是 "user_*"。现在,有一个请求是 "user_add.action ",那么,它会优先匹配"user_add " 。
?
(2)如果一个action name对应于两个带通配符的action name 那么,需要看这个配置谁在前面,它匹配写在前面的
比如 有一个 action name 是 "*_*"? 还有一个是 "user_*" ,现在,有一个请求是 "user_add.action ",.那么它会优先匹配写在前面的那个action
(3)任何带"*"的action name 优先权都是一样的,不是说带一个"*"的优先权就比带两个"*" 的高。
?
总结:因此我们应该把具有含有最多通配符的Acton配置放在最后,否则Struts2一一匹配所有的Action,这会降低程序的效率。