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" 的多种合理的解释。可以根据自己项目中的用意等来解释。。我很想知道它到底能发挥多大的作用。不怕说的不对,就怕大侠们不说嘿希望能找到我想知道的理想答案。
这里的extends="xxx-default" 有几种解释,分别是什么呢都有什么意义呢。。越详细越好哦。。分大大地。。嘿。。
解释--例如:
1. extends 表示xxxx;
2. "xxx-default" 表示‘xxxxxxx’;其中xxx可以是‘a’,也可以是‘b’,a和b的区别是(即a和b的关系型)是:。3. 最要的是 最好能给出extends="xxx-default" 的多种合理的解释。可以根据自己项目中的用意等来解释。。我很想知道它到底能发挥多大的作用。不怕说的不对,就怕大侠们不说嘿希望能找到我想知道的理想答案。
<package … />标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。它还可以用来组织管理各自独立的功能——它们也可以被进一步拆分到不同的配置文件中。
这个标签的属性包括有:
在<<深入浅出STRUTS2>>中有这样的描述:
[code=Java]
The Package Tag:
<package … />标签是用来把那些需要共享的通用信息——例如拦截器堆栈或URL命名空间——的配置组织在一起的。它通常由Action的配置组成,但也可以包括任何类型的配置信息。它还可以用来组织管理各自独立的功能——它们也可以被进一步拆分到不同的配置文件中。
这个标签的属性包括有:
都是使用的个人理解吧。
首先为什么要有package,Struts2就是通过包来组织action的。
所以你配置package的时候必须指定name属性,因为name是包的唯一标示。和主键一样。
至于extends属性和程序中的没有什么区别。如果指定了这个extends属性,那么extends的属性值,也必然是另一个包的name属性值。通过extends属性,你便可以继承到xxx-default包下拦截器,拦截器栈,已经action配置等等消息。
至于namespace就是个命名空间,该属性时可选的。如果添加了该属性,那么请求你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文件
里面定义了很多很多默认的东西 ~ 有兴趣的话 可以自己去看看
<package name="person" extends="struts-default" namespace="/person" />
</struts>
<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>
name 代表的包名 可以随便取
namespace 代表你的命名空间 这和java里面的package差不多
extends:继承的父package名称
比如说 struts-default 其实就是struts-core.jar 下面的
用户一般定义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哦!) 响应方式的推出估计不是每个人都十分了解的吧!
https://cwiki.apache.org/S2WIKI/welcome-to-apache-struts2.html
<?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>