本文主要介绍struts2配置文件中通配符的用法。
先来看一个简单的需求,index.jsp中有四个链接。
<a href="Action1_add">add1</a>
<br/><br/>
<a href="Action1_del">del1</a>
<br/><br/>
<a href="Action2_add">add2</a>
<br/><br/>
<a href="Action2_del">del2</a>
<br/><br/>
按照之前的介绍,strut.xml文件中需要写四个对应的action来进行响应,随着项目规模的逐渐扩大,需要的action数量会急剧增加,这样会导致struts.xml文件就会非常庞大。在这种背景下,通配符应运而生。上面四个action用一个共同点就是都是用“类名_方法名”的方式进行命名的,这样我们就可以用“*_*”来代替这四个action。
<struts>
<constant name="struts.action.extension" value="action,do,"/>
<package name="default" extends="struts-default" namespace="/">
<action name="*_*" class="com.jiajia.actions.{1}" method="{2}">
<result>pages/success.jsp</result>
</action>
</package>
</struts>
上面的配置文件中有两个“*”号,每个"*"代表一个字符串,在后面需要引用这些字符串时,{1}代表第一个“*”,{2}代表第二个“*”,在这种配置下,这一个action就可以对应上面的四个请求。
action文件的代码为:
package com.jiajia.actions;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
public class Action1 implements ServletRequestAware{
HttpServletRequest request;
public String add(){
request.setAttribute("msg", "add1");
return "success";
}
public String del(){
request.setAttribute("msg", "del1");
return "success";
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
}
}
package com.jiajia.actions;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
public class Action2 implements ServletRequestAware{
HttpServletRequest request;
public String add(){
request.setAttribute("msg", "add2");
return "success";
}
public String del(){
request.setAttribute("msg", "del2");
return "success";
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
}
}
这里附上尚硅谷佟刚老师总结的几个通配符的使用规则,具体的测试大家可以仿照上面的例子进行。
通配符映射规则:
–若找到多个匹配, 没有通配符的那个将胜出
–若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
–被通配符匹配到的URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
–{0}匹配整个 URI
–若 Struts 找到的带有通配符的匹配不止一个, 则按先后顺序进行匹配
–* 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.
完整示例代码在这里:http://download.csdn.net/detail/jiajia333666/9051255