当前存在的问题:在struts.xml配置文件中,每个action标签对应一个类中的方法。但是,在实际JavaWeb项目开发中,有许多继承自ActionSupport类的类(其中也包括很多方法),如果每个方法对应一个action标签,那么就会造成struts.xml非常庞大。


本节中介绍的通配符动态方法调用 就是为了解决这一问题。本节分成2个部分:(1)通配符映射 (2)动态调用


概念Struts应用可能有很多action 声明,可把多个相似的映射关系简化为一个(通用)映射关系的机制 (多个Action类----一个action标签)


1、通配符映射规则 

一般使用“*” 匹配零个或多个字符

被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…{n}


(1)精确匹配优先。若找到多个匹配, 没有通配符的那个将使用。

(2)若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配。

(3)若带有通配符的匹配多个, 以第一个匹配为准。因此要注意带有通配符的action的顺序问题


映射案例1

        <action name="*" class="com.rk.strut.d_wildcard.{1}" method="add">
            <result name="add">/wildcard/{1}.jsp</result>
        </action>

映射案例2

        <action name="user_*" class="com.rk.strut.d_wildcard.UserAction" method="{1}">
        	<result name="success">/wildcard/user/{1}.jsp</result>
        </action>

映射案例3

        <action name="*_*" class="com.rk.strut.d_wildcard.{1}" method="{2}">
        	<result name="success">/wildcard/{1}/{2}.jsp</result>
        </action>


完整的3个案例的排列顺序:user_* --> *_* --> *

        <action name="user_*" class="com.rk.strut.d_wildcard.UserAction" method="{1}">
        	<result name="success">/wildcard/user/{1}.jsp</result>
        </action>
        <action name="*_*" class="com.rk.strut.d_wildcard.{1}" method="{2}">
        	<result name="success">/wildcard/{1}/{2}.jsp</result>
        </action>
        <action name="*" class="com.rk.strut.d_wildcard.{1}" method="add">
            <result name="add">/wildcard/{1}.jsp</result>
        </action>





2、动态调用

动态方法调用: 通过在 url 中指定方法名动态调用 Action 中的方法

  语法形式:action名字+!+调用的Action方法名


Struts 2动态方法默认可用, 则可在 struts.xml 文件中添加 constant 元素禁用该功能: 

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

完整的struts.xml中配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
</struts>


案例1

        <action name="flower" class="com.rk.strut.d_wildcard.FlowerAction" >
        	<result name="add">/wildcard/flower/add.jsp</result>
        	<result name="delete">/wildcard/flower/delete.jsp</result>
        </action>

访问地址:

http://127.0.0.1:8080/hello/rk/wildcard/flower!add.action
http://127.0.0.1:8080/hello/rk/wildcard/flower!delete.action