Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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属性用于指定某个包对应的命名空间,对命名空间的讲解请看下节。