动态方法:
Action执行的时候,并不一定要执行execute方法.
可以在配置文件中配置Action的时候用method=方法名,也可以在跳转的url地址中动态指定(动态方法调用MDI---!加上方法名),
这样在资源的访问上会比较灵活,不过虽然method可以动态指定,依然有一点不好的地方:加入你有没有公布的方法,而人家又知道你
这个方法的方法名,那就会引发安全问题了,并且result没有办法动态指定.所以通配符映射就很重要了。
动态方法调用示例:
package com.test.actions;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
public String add(){
return SUCCESS;
}
public String delete(){
return "del";
}
}
Xml文件内容
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="hello" class="com.test.actions.UserAction">
<result>/Hello.jsp</result>
<result name="del">/delete.jsp</result>
</action>
</package>
在访问页面时,只需要在action的name后加上“!方法名”就行了。
可以在Strut.xml文件中禁用动态方法调用<!--value设为false-->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
通配符映射:
在一个大型程序中,可能会有几十几百个动作,通配符映射机制可以减少大量配置文件
配置文件内容:
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="*_*" class="com.test.actions.{1}Action" method="{2}">
<result>/{2}.jsp</result>
</action>
</package>
按此配置,在访问访问User_add或者User_delete时,都会与此匹配.
User与第一个*匹配,add或者delete与第二个*匹配(另外,User与{1}匹配,找到指定的action,add或delete与{2}匹配,找到指定的视图).
需要注意的地方:
1.“{}”中的数字顺序是从1开始的.
2.如果action中有指定的name,那么将会调用name精确的那个动作.
3.如果有User_*的配置和*_*的配置同时存在,那么他们的级别是相同的.谁放在前面就调用谁(有的书上说谁放前面执行谁,有的书上说谁在最后执行谁...我自己的试验结果是前者.).
注意:*匹配多个字符,但是不包括"/"字符,如果想把"/"包含进去.需要使用**,如果需要转义,就需要使用"\"