在使用struts2时,每一个action都需要配置,每一个action里面的方法以及其返回到的界面都需要配置,如果一个一个配置,就太麻烦了,这里我们可以约定一些命名规范,然后再struts.xml里面使用通配符配置。
通配符配置的好处:在做项目时,不可能一个action类只处理一个业务(因为这样降低了代码的可读性),所以项目中一个action可能要处理很多个业务,这时如果每个业务都要配置一个<action></action>就会很麻烦,会降低代码可读性。这时就可使使用通配符来配置。通配符配置action其实是一种动态调用。
先看一段Action里面的struts.xml的配置:
<!-- 常量配置 -->
<constant name="struts.i18n.reload" value="false"></constant>
<constant name="struts.devMode" value="false"></constant>
<!-- 包含文件配置 -->
<!-- <include file="struts-user.xml"></include> -->
<!-- 配置包元素 -->
<package name="default" extends="struts-default" namespace="/">
<interceptors> <!-- 拦截器根元素 -->
<interceptor-stack name="crudStack"><!-- 拦截器栈 -->
<!-- 拦截器 -->
<interceptor-ref name="checkbox"></interceptor-ref>
<interceptor-ref name="params"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!--其中所说的通配符配置,主要是针对这一部分使用通配符-->
<action name="login" class="com.web.action.LoginAction">
<result name="success">/success.jsp</result>
<result name="index">/index.jsp</result>
</action>
</package>
举个例子:
<package name="default" extends="struts-default" namespace="/">
<action name="login_*" class="com.web.action.LoginAction" methiod=“{1}”>
<result name="success">/login_{1}.jsp</result>
</action>
</package>
本例子的解释:
1、“login_*”:login_之后可以匹配任意字符,比如:login_add;
2、method=“{1}":表示method属性值匹配第一个 “*” 的内容。比如:name="login_add",则method="add";
3、login_{1}.jsp:这里的{1}跟method=“{1}"中是一样的。
注意:这里的name属性值只有一个 * ,还可以有两个、三个、甚至跟多,比如有两个。写成name=“*_*”;此时可以使用{1}代表第一个 *,{2}代表第二个 *。
涉及到通配符配置的还有一个问题:就是当一个struts.xml里面有两个配置都可以和当前的请求匹配时,程序该执行哪一个呢?这就涉及到执行优先级问题。
例如以下情况:
<package name="default" extends="struts-default" namespace="/">
<action name="*" class="com.web.action.LoginAction" methiod=“{1}”>
<result name="success">/login_{1}.jsp</result>
</action>
<action name="login_*" class="com.web.action.LoginAction" methiod=“{1}”>
<result name="success">/login_{1}.jsp</result>
</action>
<action name="login_add" class="com.web.action.LoginAction" methiod=“{1}”>
<result name="success">/login_{1}.jsp</result>
</action>
</package>
检索顺序:如果能找到name属性与请求的action名称完全一致的action时,就直接匹配那个完全一致的action。如:如果请求的action名称是login_add,就不会再使用通配符去匹配,而直接匹配name="login_add"的action。
如果找不到name属相与请求的action名称完全一致的action时,就按照顺序匹配。比如:请求的action名称是login_del,找不到name=“login_del”的action,就会按照顺序匹配,就会匹配到name=“*”的action。