当struts配置文件中的一个package中有多个action都能匹配同一个请求的Url时,struts会选择其中的一个进行处理,具体怎样进行选择,请看如下实例:
struts配置如下:
<constant name="struts.enable.SlashesInActionNames" value="true" />
<package name="page" namespace="/page" extends="struts-default">
<default-action-ref name="test"/>
<action name="test" class="Test" method="test">
<result>/test.jsp</result>
</action>
<action name="*/test/**" method="test1" class="Test">
<result>/test1.jsp</result>
</action>
<action name="*/*/**" method="test2" class="Test">
<result>/test2.jsp</result>
</action>
<action name="a/test/b" method="test3" class="Test">
<result>/test3.jsp</result>
</action>
</package>
对以下请求url及action选择
请求url action匹配
1 http://localhost/site/page/a/tes/b action name="*/*/**"
2 http://localhost/site/page/a/test/a action name="*/test/**"
3 http://localhost/site/page/a/test/b action name="a/test/b"
4 http://localhost/site/page/a/test action name="test"
struts2选择package里的action过程如下:
1. 查找action name完全匹配的,找到则返回,否则进入2.
2. 按顺序(即在配置文件中的顺序)查找通配符匹配action name,找到则返回,否则进入3.
3. 选择 default action,如果没有配置default action,则返回null.
源码
com.opensymphony.xwork2.config.impl.DefaultConfiguration.java
...
ActionConfig findActionConfigInNamespace(String namespace, String name) {
ActionConfig config = null;
if (namespace == null) {
namespace = "";
}
Map<String, ActionConfig> actions = namespaceActionConfigs.get(namespace);
if (actions != null) {
config = actions.get(name);
// Check wildcards
if (config == null) {
config = namespaceActionConfigMatchers.get(namespace).match(name);
// fail over to default action
if (config == null) {
String defaultActionRef = namespaceConfigs.get(namespace);
if (defaultActionRef != null) {
config = actions.get(defaultActionRef);
}
}
}
}
return config;
}
...
struts配置如下:
<constant name="struts.enable.SlashesInActionNames" value="true" />
<package name="page" namespace="/page" extends="struts-default">
<default-action-ref name="test"/>
<action name="test" class="Test" method="test">
<result>/test.jsp</result>
</action>
<action name="*/test/**" method="test1" class="Test">
<result>/test1.jsp</result>
</action>
<action name="*/*/**" method="test2" class="Test">
<result>/test2.jsp</result>
</action>
<action name="a/test/b" method="test3" class="Test">
<result>/test3.jsp</result>
</action>
</package>
对以下请求url及action选择
请求url action匹配
1 http://localhost/site/page/a/tes/b action name="*/*/**"
2 http://localhost/site/page/a/test/a action name="*/test/**"
3 http://localhost/site/page/a/test/b action name="a/test/b"
4 http://localhost/site/page/a/test action name="test"
struts2选择package里的action过程如下:
1. 查找action name完全匹配的,找到则返回,否则进入2.
2. 按顺序(即在配置文件中的顺序)查找通配符匹配action name,找到则返回,否则进入3.
3. 选择 default action,如果没有配置default action,则返回null.
源码
com.opensymphony.xwork2.config.impl.DefaultConfiguration.java
...
ActionConfig findActionConfigInNamespace(String namespace, String name) {
ActionConfig config = null;
if (namespace == null) {
namespace = "";
}
Map<String, ActionConfig> actions = namespaceActionConfigs.get(namespace);
if (actions != null) {
config = actions.get(name);
// Check wildcards
if (config == null) {
config = namespaceActionConfigMatchers.get(namespace).match(name);
// fail over to default action
if (config == null) {
String defaultActionRef = namespaceConfigs.get(namespace);
if (defaultActionRef != null) {
config = actions.get(defaultActionRef);
}
}
}
}
return config;
}
...