一:概述
概念:
应用可能有很多个action 声明,可把多个相似的映射关系简化为一个映射关系的机制 (多个Action类----一个action标签)
通配符映射规则:
一般使用“*” 匹配零个或多个字符,被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用。 {1} 匹配第一个子串, {2} 匹配第二个子串…以此类推。
若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名进行匹配 。
若带有通配符的匹配多个, 以最后一个匹配为准。
二:三种通配符的使用方法(具体结合代码示例十分便于理解)
1.不同的Action类中,同样功能的方法通配
2.同一个Action类中,不同功能的方法通配
3.不同Action类中,不同功能的方法的通配
三:动态方法调用
动态方法调用: 通过在 url 中指定方法名动态调用 Action 中的方法
语法形式:action名字+!+调用的Action方法名。
Struts 2动态方法默认可用, 则可在 struts.xml 文件中添加 constant 元素禁用该功能:
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
四:示例
构造两个简单的action:
1. CustomerAction
package com.tianci.struts2_wildcard; import com.opensymphony.xwork2.ActionSupport; public class CustomerAction extends ActionSupport { // 无参数的构造器 public CustomerAction() { } // add public String add() { System.out.println("call add method of CustomerAction."); return "add"; } // delete public String delete() { System.out.println("call delete method of CustomerAction."); return "delete"; } }
2.OrderAction
package com.tianci.struts2_wildcard; import com.opensymphony.xwork2.ActionSupport; public class OrderAction extends ActionSupport { // 无参数的构造器 public OrderAction() { } // add public String add() { System.out.println("call add method of OrderAction."); return "add"; } // delete public String delete() { System.out.println("call delete method of OrderAction."); return "delete"; } }
xml子配置文件:
?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="false" /> <constant name="struts.custom.i18n.resources" value="fileuploadresource" /> <package name="struts2_wildcard" namespace="/struts2_wildcard" extends="struts-default"> <!-- 示例一: 不同的Action类中,同样功能的方法通配。如下:通配到了不同action中的add方法 --> <action name="*_add" class="com.tianci.struts2_wildcard.{1}" method="add"> <result name="add"> /struts2_wildcard/{1}.jsp </result> </action> <!-- 示例二:同一个Action类中,不同功能的方法通配。 --> <!-- 都能匹配上,则在最前面的优先覆盖掉后面的。如:本例中测试,OrderAction_add.action 时。匹配到的结果是:add方法。 --> <action name="OrderAction_*" class="com.tianci.struts2_wildcard.OrderAction" method="{1}"> <result name="add"> /struts2_wildcard/Add.jsp </result> <result name="delete"> /struts2_wildcard/Delete.jsp </result> </action> <!-- 示例三:不同Action类中,不同功能的方法的通配。 --> <!-- 示例中可以通配到这些方法:/struts2_wildcard/CustomerAction_add.action; /struts2_wildcard/CustomerAction_delete.action; /struts2_wildcard/OrderAction_add.action; /struts2_wildcard/OrderAction_delete.action; --> <action name="*_*" class="com.tianci.struts2_wildcard.{1}" method="{2}"> <result name="add"> /struts2_wildcard/{1}.jsp </result> <result name="delete"> /struts2_wildcard/Delete.jsp </result> </action> <!-- 动态方法调用 语法形式:action名字+!+调用的Action方法名--> <!--示例:如在本地访问时,项目名为:struts2;namespace名为:struts2_wildcard 则访问 OrderAction中add方法的url为"http://localhost:8080/struts2/struts2_wildcard/OrderAction!add" --> <action name="OrderAction" class="com.tianci.struts2_wildcard.OrderAction"> <result name="add"> /struts2_wildcard/Add.jsp </result> </action> </package> </struts>