动态方法:

         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>

 

在访问页面时,只需要在actionname后加上“!方法名”就行了。

 

Struts2动态方法调用(DMI)和通配符映射机制 - 盡頭 - 深山憨娃
Struts2动态方法调用(DMI)和通配符映射机制 - 盡頭 - 深山憨娃

可以在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,adddelete{2}匹配,找到指定的视图).

 

需要注意的地方:

1.“{}”中的数字顺序是从1开始的.

2.如果action中有指定的name,那么将会调用name精确的那个动作.

3.如果有User_*的配置和*_*的配置同时存在,那么他们的级别是相同的.谁放在前面就调用谁(有的书上说谁放前面执行谁,有的书上说谁在最后执行谁...我自己的试验结果是前者.).

Struts2动态方法调用(DMI)和通配符映射机制 - 盡頭 - 深山憨娃
 
Struts2动态方法调用(DMI)和通配符映射机制 - 盡頭 - 深山憨娃
 
 
注意:*匹配多个字符,但是不包括"/"字符,如果想把"/"包含进去.需要使用**,如果需要转义,就需要使用"\"