struts2的xml配置文件中:突然对这个细想了下,有很多的疑惑点,平时都没有刻意的思考过。。在这里求证下,多谢大侠们。<package name="xx-xx-xx-xx" namespace="/xx/xx/xx/xx" extends="xxx-default"></package>
这里的extends="xxx-default" 有几种解释,分别是什么呢都有什么意义呢。。越详细越好哦。。分大大地。。嘿。。
解释--例如:
1. extends 表示xxxx;
2. "xxx-default" 表示‘xxxxxxx’;其中xxx可以是‘a’,也可以是‘b’,a和b的区别是(即a和b的关系型)是:。3. 最要的是 最好能给出extends="xxx-default" 的多种合理的解释。可以根据自己项目中的用意等来解释。。我很想知道它到底能发挥多大的作用。不怕说的不对,就怕大侠们不说嘿希望能找到我想知道的理想答案。

解决方案 »

  1.   

    在<<深入浅出STRUTS2>>中有这样的描述:The Package Tag:
    <package … />标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。它还可以用来组织管理各自独立的功能——它们也可以被进一步拆分到不同的配置文件中。
    这个标签的属性包括有:
      

  2.   

    刚才多了两句没用的话
    在<<深入浅出STRUTS2>>中有这样的描述:
    [code=Java]
    The Package Tag:
    <package … />标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。它还可以用来组织管理各自独立的功能——它们也可以被进一步拆分到不同的配置文件中。
    这个标签的属性包括有:
      

  3.   

    佩佩@!!!!!!!
    都是使用的个人理解吧。
    首先为什么要有package,Struts2就是通过包来组织action的。
    所以你配置package的时候必须指定name属性,因为name是包的唯一标示。和主键一样。
    至于extends属性和程序中的没有什么区别。如果指定了这个extends属性,那么extends的属性值,也必然是另一个包的name属性值。通过extends属性,你便可以继承到xxx-default包下拦截器,拦截器栈,已经action配置等等消息。
    至于namespace就是个命名空间,该属性时可选的。如果添加了该属性,那么请求你action的时候需要添加上命名空间。
      

  4.   

    5楼解释的对啊!struts并不难,买本实用的书,看看,自然就明白了!加油!
      

  5.   

    <!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, default-class-ref?, global-results?, global-exception-mappings?, action*)>
    <!ATTLIST package
        name CDATA #REQUIRED
        extends CDATA #IMPLIED
        namespace CDATA #IMPLIED
        abstract CDATA #IMPLIED
        externalReferenceResolver NMTOKEN #IMPLIED
    ><struts>
        <package name="person" extends="struts-default" namespace="/person" />
    </struts>
    extends="struts-default"  继承默认的struts.xml文件在struts2-core-2.1.x.xjar包里面  有一个struts-default.xml文件
    里面定义了很多很多默认的东西 ~  有兴趣的话 可以自己去看看
      

  6.   

    <struts>
        <package name="person" extends="struts-default" namespace="/person" />
    </struts>
      

  7.   

    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
    <struts>    <!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
        <include file="struts-default.xml"></include>
       
       
        <!-- package提供了将多个Action组织为一个模块的方式
            package的名字必须是唯一的 package可以扩展 当一个package扩展自
            另一个package时该package会在本身配置的基础上加入扩展的package
            的配置 父package必须在子package前配置
            name:package名称
            extends:继承的父package名称
            abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
            namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test /XX.action
         -->
        <package name="com.kay.struts2" extends="struts-default" namespace="/test">
            <interceptors>
                <!-- 定义拦截器
                    name:拦截器名称
                    class:拦截器类路径
                 -->
                <interceptor name="timer" class="com.kay.timer"></interceptor>
                <interceptor name="logger" class="com.kay.logger"></interceptor>
                <!-- 定义拦截器栈 -->
                <interceptor-stack name="mystack">
                    <interceptor-ref name="timer"></interceptor-ref>
                    <interceptor-ref name="logger"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
           
            <!-- 定义默认的拦截器 每个Action都会自动引用
             如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
            <default-interceptor-ref name="mystack"></default-interceptor-ref>
           
           
            <!-- 全局results配置 -->
            <global-results>
                <result name="input">/error.jsp</result>
            </global-results>
           
            <!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)
                 name:action名称
                 class: 对应的类的路径
                 method: 调用Action中的方法名
            -->
            <action name="hello" class="com.kay.struts2.Action.LoginAction">
                <!-- 引用拦截器
                    name:拦截器名称或拦截器栈名称
                 -->
                <interceptor-ref name="timer"></interceptor-ref>
           
                <!-- 节点配置
                    name : result名称 和Action中返回的值相同
                    type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher
                 -->
             <result name="success" type="dispatcher">/talk.jsp</result>
             <!-- 参数设置
                 name:对应Action中的get/set方法
             -->
             <param name="url">http://www.sina.com</param>
            </action>
        </package>
    </struts> 
      

  8.   

    extends有点像java的“父类和子类的关系”,你现在的包就好比子类,如果你想继承父类的一些属性的话,用extends就对了。很多父包的配置在子包中就直接能用了,方便些。。
      

  9.   

    <package name="xx-xx-xx-xx" namespace="/xx/xx/xx/xx" extends="xxx-default"></package>
    name 代表的包名 可以随便取
    namespace 代表你的命名空间 这和java里面的package差不多 
    extends:继承的父package名称
    比如说 struts-default 其实就是struts-core.jar 下面的 
      

  10.   

      struts-default 是struts2默认载入的配置文件,理解这个文件至关重要。
      用户一般定义struts.xml时,默认会继承struts-default.xml,这个和package继承的概念是不一样的。是为了使用struts-default.xml中的默认配置。例如 <bean ....>  声明的 Intercepter result-types
      
      其中只有package标签是针对用户的业务配置的。一般用来配一些和struts1对应的action  exception map 之类的  <bean ....>配置属于核心配置,一般用户很少去修改,除非某些处理方面需要自定义。  <Intercepters>配置,一般是用户需要自定义拦截器的时候使用,并在对应的action ref定义的intercepter/stack  <result-types> 是struts2的结果类型,即view是由jsp、freemaker、plain-text、xslt来表达所以result-type 跟扩展相关,即意味着你如果要在struts.xml中定义result-type即意味你要扩展struts2 view的输出方式了。struts2 的 struts.properties 和 <constants>配置是等价的,可以配置properties  locale 之类的信息。
    楼上有人说的很好,学习配置学会看 DTD 是很重要的,DTD把配置的格式已经完全展现了。只是struts2的DTD做的不是太完美,并没有把element或 attribute的值将行罗列,并解释(这方面的是比较遗憾的)DTD中可以很明显的看出带+号的即用于扩展。result-type 就是带着扩展的标志。楼主真想学struts2 建议在javaeye上看下 darkranger 写的讲义,非常不错!
    再个,楼上说struts2不难,也许您仅仅是针对简单使用。但作为一个开发人员来说,仅仅使用可能只是很初级的技能而已,而且使用的好坏区别是非常大的。struts 2从 06年诞生,发展到现在,如果你觉得简单,不觉的是对struts2的开发者是种讽刺啊。struts 2每个版本更新不少的,提供的新东西也多。struts 2 coc的支持,新的EL的使用,rest完整支持,asyn(可不是ajax哦!) 响应方式的推出估计不是每个人都十分了解的吧!
      

  11.   

    最权威的资料
    https://cwiki.apache.org/S2WIKI/welcome-to-apache-struts2.html
      

  12.   

    学习struts2真的不太难 慢慢琢磨吧 跑几个DEMO
      

  13.   

    18 L 说的很好,21 L 也很棒。。如果 struts2 自定义的拦截器 配置,还是有很多弊端的,,, 就是自己写的拦截器。。大家可以说说呀
      

  14.   


    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     "http://struts.apache.org/dtds/struts-2.0.dtd" >
    <struts> <constant name="struts.objectFactory" value="spring"></constant> <package name="login" extends="struts-default" namespace="/login">
    <!-- 配置自定义的拦截器栈 --> <interceptors>
    <interceptor name="group"
    class="com.ascent.interceptor.GroupInterceptor">
    </interceptor>
    <interceptor-stack name="groupStack">
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <interceptor-ref name="group"></interceptor-ref>
    </interceptor-stack>
    </interceptors> <!-- 配置全局结果与视图的映射关系 -->
    <global-results>
    <result name="unit_login" type="chain">unit</result>
    <result name="expert_login" type="chain">expert</result>
    <result name="admin_login" type="chain">admin</result>
    <result name="login">/index.jsp</result> </global-results> <!-- 配置异常处理 
            <global-exception-mapping>
              <exception-mapping result="error.jsp" exception="java.lang.Exception"></exception-mapping>
            </global-exception-mapping>
            -->
    <!-- 配置action对应的视图 -->
    <action name="unit">
    <result>/unit/unit_index.jsp</result>
    <interceptor-ref name="groupStack"></interceptor-ref>
    </action>
    <action name="expert">
    <result>/expert/expert_index.jsp</result>
    <interceptor-ref name="groupStack"></interceptor-ref>
    </action>
    <action name="admin">
    <result>/admin/admin_index.jsp</result>
    <interceptor-ref name="groupStack"></interceptor-ref>
    </action>
    <!-- 配置请求的URL与Action的映射关系 -->
    <action name="loginAction" class="loginAction" method="login">
    <!-- 配置局部INPUT视图 -->
    <result name="input">/login.jsp</result>
    </action> </package>
    <package name="logout" namespace="/logout"
    extends="struts-default">
    <action name="logoutAction"
    class="com.ascent.action.LogoutAction">
    <result type="redirect">/index.jsp</result>
    </action>
    </package> <package name="adminPackage" namespace="/admin"
    extends="struts-default">
    <action name="UserListAction" class="UserListAction"
    method="findUserByPage">
    <result>/admin/showusers.jsp</result>
    </action> <action name="AddUserAction" class="AddUserAction"
    method="addUser">
    <result name="user_list">/admin/showusers.jsp</result>
    </action>
    </package> <package name="expertPackage" namespace="/admin"
    extends="struts-default">
    <action name="ExpertListAction" class="ExpertListAction"
    method="findExpertByPage">
    <result>/admin/showexperts.jsp</result>
    </action> </package> <package name="unitPackage" namespace="/admin"
    extends="struts-default">
    <action name="UnitListAction" class="UnitListAction"
    method="findUnitByPage">
    <result>/admin/showunits.jsp</result>
    </action> </package> <package name="unitviewPackage" namespace="/unit"
    extends="struts-default">
    <action name="UnitViewAction" class="UnitViewAction">
    <result name="unitinfo">/unit/viewunitinfo.jsp</result>
    <result name="updatesuccess">/unit/viewunitinfo.jsp</result> </action> </package> <package name="projectPackage" namespace="/admin"
    extends="struts-default">
    <action name="ProjectListAction" class="ProjectListAction"
    method="findProjectByPage">
    <result>/admin/showprojects.jsp</result>
    </action>
    </package>
    </struts>