3.4.3 包配置
Struts 2框架的核心组件就是Action、拦截器等,Struts 2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
配置包时,必须指定name属性,该属性值是该包的唯一标识。除此之外,还可以指定一个可选的extends属性,extends属性值必须是另一个包的name属性。指定extends属性表示让该包继承其他包,子包可以继承一个或多个父包中的拦截器、拦截器栈、action等配置。
除此之外,Struts 2还提供了一种所谓的抽象包,抽象包不能包含Action定义。为了显式指定一个包是抽象包,可以为该package元素增加abstract="true"属性。
在struts.xml文件中,package元素用于定义包配置,每个package元素定义了一个包配置。定义package元素时可以指定如下几个属性。
name:这是一个必填属性,它指定该包的名字,此名字是该包被其他包引用的key。
extends:该属性是一个可选属性,它指定该包继承其他包。继承其他包,可以继承其他包中的Action定义、拦截器定义等。
namespace:该属性是一个可选属性,该属性定义该包的命名空间。
提示:
关于命名空间的配置,请参阅下一节。
abstract:该属性是一个可选属性,它指定该包是否是一个抽象包。抽象包不能包含Action定义。
注意
因为Struts 2的配置文件是从上到下处理的,所以父包应该在子包前面定义。当应用中有多个 struts.xml 配置文件时,多个配置文件的<struts.../>元素可通过order属性来指定加载顺序。
下面是一个简单的struts.xml配置文件范例。在下面的struts.xml文件中配置了两个包,其中名为default的包,继承了Struts 2框架的默认包struts-default。
<struts> <!-- 配置第一个包,该包名为default,继承struts-default包--> <package name="default" extends="struts-default"> <!-- 下面定义了拦截器部分--> <interceptors> <!-- 定义拦截器栈 --> <interceptor-stack name="crudStack"> <interceptor-ref name="params" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-action-ref name="index"/> <!-- 定义一个Action,该Action直接映射到index.jsp页面 --> <action name="index "> <result>/index.jsp</result> </action> <!-- 定义一个Action,该Action类为lee.DateAction --> <action name="Date" class="lee.DateAction"> <result name="success">/date.jsp</result> </action> </package> <!-- 定义名为skill的包,该包继承default包 --> <package name="skill" extends="default" namespace="/skill"> <!-- 定义默认的拦截器引用 --> <default-interceptor-ref name="crudStack"/> <!-- 定义名为edit的Action,该Action对应的处理类为lee.SkillAction --> <action name="edit" class="lee.SkillAction"> <result>/empmanager/editSkill.jsp</result> <interceptor-ref name="params" /> <interceptor-ref name="basicStack"/> </action> <!-- 定义名为save的Action,该Action对应的处理类为lee.SkillAction 使用save方法作为处理方法 --> <action name="save" class="lee.SkillAction" method="save"> <result name="input">/empmanager/editSkill.jsp</result> <result type="redirect">edit.action?skillName=${curSkill.name}</result> </action> <!-- 定义名为delete的Action,该Action对应的处理类为lee.SkillAction 使用delete方法作为处理方法 --> <action name="delete" class="lee.SkillAction" method="delete"> <result name="error">/empmanager/editSkill.jsp</result> <result type="redirect">edit.action?skillName=${curSkill.name}</result> </action> </package> </struts>
在上面的配置文件中,配置了两个包,在定义名为skill的包时, 还指定了该包的命名空间为/skill。其中namespace属性用于指定某个包对应的命名空间,对命名空间的讲解请看下节。