我们知道,struts2是基于servlet的框架,而servlet的缺点之一就在于web.xml繁多,给团队开发带来不便。
在讲通配符之前,我们先来介绍<include>标签
通过上一篇,我们知道要想正确搭建struts2框架,必须要配置struts.xml。但是这么一来,貌似与web.xml并没有太大的区别。
在struts中,为了解决这一问题,提供了可使一个或多个action类使用的配置文件。
首先,我们来看单个类对应的配置文件,这就用到了我们提到的<include>标签
<?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>
<package name="actiontest11111" namespace="/base" extends="struts-default">
<action name="hellowordaction" class="com.struts2.actiontest.hellowordaction">
<result name="sucess">/test/SUCESS.jsp</result>
</action>
</package>
<pre name="code" class="html"><span style="white-space:pre"> </span></include>
<span style="white-space:pre"> </span><!-- file 代表所要引进的xml路径,teacher_struts.xml即TeacherAction 的xml文件,此时的配置文件名自定义-->
<include file="com/struts2/teacheraction/teacher_struts.xml"></include><!-- file </struts>
对于单个类对应配置文件,很好理解,但是,当我们需要调用action中的不同方法,或是调用不同action中的相同方法时,好像问题又回到了原点,这时,通配符就能帮我们解决这个棘手的问题
(一)不同的链接(可以理解不同的权限)请求相同函数。下图是不使用通配符的情况
<span style="white-space:pre"> </span><!--
a_add.action、b_add.action、c_add.action全部请求PatternAction的add方法
-->
<action name="a_add" class="cn.heima6.struts2.action.pattern.PatternAction" method="add">
<result name="add">successPattern.jsp</result>
</action>
<action name="b_add" class="cn.heima6.struts2.action.pattern.PatternAction" method="add">
<result name="add">successPattern.jsp</result>
</action>
<action name="c_add" class="cn.heima6.struts2.action.pattern.PatternAction" method="add">
<result name="add">successPattern.jsp</result>
</action>
我们可以看到,有几个action就得配置几次,
<span style="white-space:pre"> </span><!--
改进
*_add
这里*代表任意字符串
-->
<action name="*_add"
class="cn.heima6.struts2.action.pattern.PatternAction"
method="add">
<result name="add">successPattern.jsp</result>
</action>
(二)不同action请求相同的函数
<!--
请求PersonAction和StudentAction的add方法
-->
<!--
<action name="personAction_add" class="cn.heima6.struts2.action.pattern.PersonAction" method="add">
<result name="add">successPattern.jsp</result>
</action>
<action name="studentAction_add" class="cn.heima6.struts2.action.pattern.StudentAction" method="add">
<result name="add">successPattern.jsp</result>
</action>
-->
我们可以看到,除去action的名字不同之外,其他的配置都相同
此时,我们使用通配符进行配置
<span style="white-space:pre"> </span><!--
改进
{1}与前面的*号匹配,但是,<span style="background-color: rgb(255, 0, 0);">注意,此时的*号必须是类名,因为class中进行了引用</span>
-->
<action name="*_add"
class="cn.heima6.struts2.action.pattern.{1}" method="add">
<result name="add">successPattern.jsp</result>
</action>
(三)请求同一个action类的不同方法
<!--
请求PatternAction的aa,bb,cc,dd方法
-->
<action name="patternAction_*"
class="cn.heima6.struts2.action.pattern.PatternAction"
method="{1}">
<result name="success">successPattern.jsp</result>
</action>
(四)请求一一对应的不同类的不同方法
<!--
请求PersonAction和StudentAction中的aa,bb方法
-->
<action name="*_*" class="cn.heima6.struts2.action.pattern.{1}"
method="{2}">
<result name="success">successPattern.jsp</result>
</action>
此时,配置好后,引入struts.xml