`

struts.xml中的include标签和package标签以及action标签的name属性

阅读更多

struts.xml中的<include/>标签 
当系统变大后,可能会导致struts.xml 内容非常多,这时我们就可以采用模块化 的方式
将不同的配置文件分散在不同的配置里面,然后由struts.xml将它们统一的加载进来
比如struts_1.xml struts_2.xml struts_3.xml 三个文件,分别是针对不同模块的配置
最后就可以由struts.xml统一将其整合起来,整合的方式就是把这它们包含进来即可
<include file="struts_1.xml"/><include file="struts_2.xml"/><include file="struts_3.xml"/> 
struts_1.xml 或者struts_2.xml 中的配置方式与struts.xml 中的配置方式是一模一样 
即它们顶部都必须有 XML声明 DTD ,它们DTD都是相同的,接下来是<struts/>根元素 
即不能认为struts_1.xml 是被包含文件,便将顶部XML声明和DTD省略掉,这是不可以的
最后由struts.xml统一引入,于是系统加载,便将struts_1.xml及struts_2.xml等的配置都加载到内存中
这就相当于进行模块化的配置。对于大中型的系统来说,是不可避免的会使用模块化的配置方式的


struts.xml中<package name="#"/>的命名 
其中struts.xml中<package/>的name 可随意命名,不会影响到其它的任何东西
它的name属性的作用仅仅是用来标识<package/> 的,以便另外的<package/>可以继承 


<package name="struts-default" abstract="true"> 
在struts-default.xml的第73行配置<package/>时,声明了一个abstract="true" 属性
我们发现这个包中声明了结果类型、拦截器等等,却唯独没有声明<action/> 的配置
但是在我们自己定义的struts.xml 中有若干个<action/>的配置
因此abstract="true" 表示当前包是抽象包,所以当前包中不允许出现<action/> 的配置
抽象包的作用极类似于Java抽象类。自己不能实例化,只能被继承,然后由子类实现它的若干方法,最后由子类实例化
所以struts-default包中不能包含任何<action/>定义,具体的定义则是由其子包来定义的


<package name="struts2" extends="struts-default">中的extends的含义 
Struts2中可以用包机制 区分不同的Action,而将功能相似 的Action放到一个package 
类似于Java中包的机制,不同的是Struts2的包支持多继承 ,如下所示
<package name="struts2" extends="struts-default, jfreechart-default"> 
并且Struts2的package之间,又是可以实现继承 关系的
继承之后就可以把被继承的package中的所有东西都拿来使用了
所以它就相当于将<package name="struts-default"/> 的全部东西都继承过来了
于是才可以直接把struts-default.xml 包中的所有结果类型、拦截器等都拿来供我们使用
如果我们的包不继承Struts2提供的struts-default包,那么我们很多工作都会变得无法完成
在Struts2应用启动时会自动读取struts-default.xml ,将该文件定义的所有东西加载到内存中 
接下来再加载当前应用的struts.xml 文件,然后将内存中struts-default.xml的信息读取过来
然后才会加入到我们当前的应用中,并且在default.properties 的第180行和181行有如下代码
### A list of configuration files automatically loaded by Struts
struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml
翻译 :被Struts自动加载的一个配置文件列表
         应用启动时加载顺序是:先加载struts-default.xml 次之struts-plugin.xml 最次struts.xml 
因此:后者中的配置信息就可以覆盖掉前者中的配置信息


<package/>的namespace属性 
若未配置<package/>标签的namespace属性,则相当于namespace="" ,表示当前package位于默认命名空间里
命名空间要以斜线开头 ,假设包的namespace="/hello" ,且表单action="login" ,然后在页面中点击提交 按钮
这时在页面中将显示The requested resource (/struts2/login) is not available 
这时可将表单改为action="/hello/login" 或在表单中使用namespace和action属性分开来写
<form action="login" namespace="/hello"> 注意此时若写成login.action则会出错 
修改完表单action后,再次提交时显示的却是The requested resource (/struts2/hello/login) is not available 
这是因为根本就不存在这个路径,正确的路径应该是/struts2/hello/login.action 
所以配置包的namespace后,须手工添加action后缀,即action="/hello/login.action" 
再次提交则正常显示,且浏览器显示的是http://127.0.0.1:8088/struts2/hello/login.action 
另外 :假设发送action="/test/login.action" 请求,但struts.xml 中根本就没有 命名空间为test 的包
当Struts2发现该命名空间不存在时,它会到默认命名空间 下寻找login的<action/> 的信息
假设发送action="/hello/login.action" 请求,当/hello 的namespace下不存在login.action时
Struts2会尝试到默认的命名空间下去寻找有没有名字叫做login的<action/>信息
若默认命名空间下不存在名为login的<action/>的信息,则会报告资源找不到的错误


Struts2还支持根命名空间【"/"】 
当直接请求contextPath 下的资源时,它会先到根命名空间 下寻找匹配的Action
例如请求http://127.0.0.1:8088/project/BB.action 时,Strtus2会首先到"/" 命名空间下去找这个Action
服务器的根 http://127.0.0.1:8088/ 
网   站的根 http://127.0.0.1:8088/struts2_demo/ 
假设JSP中写成<a href=“/login.jsp”></a> ,则实际指向 的是http://127.0.0.1:8088/login.jsp 
JSP中的根 指的是服务器的根 。而命名空间的斜杠 代表网站的根 ,也叫项目的根 或者应用的根


struts.xml中<action/>的name值的开头不允许加斜杠 
这是由default.properties 的第109行属性决定,即struts.enable.SlashesInActionNames 默认为FALSE 
比如说在struts.xml中,不指定<package/>的namespace属性,并写成<action name="hello/login"> 
再在表单中写成action="<%=request.getContextPath()%>/hello/login.action" ,此时仍可正常访问
但要注意:此时不能写成<action name="/hello/login"/> ,否则在运行时仍会报告404错误 
总之直接使用命名空间就是了,不建议修改struts.enable.SlashesInActionNames 属性,保持默认配置即可

分享到:
评论
1 楼 wodetongnian 2014-09-21  
感谢大牛,写的的这么全面,好久没看到这么好的博文了。

相关推荐

    struts.xml配置详解

    比如在大型项目中,可以将用户管理、商品管理和订单管理等不同的功能模块分别配置在不同的xml文件中(如user.xml、goods.xml和order.xml),然后通过struts.xml中的&lt;include&gt;标签将这些模块配置文件引入主配置文件中...

    struts.xml(struts2配置)

    Struts2支持动态方法调用,允许不预先在`struts.xml`中定义Action,而是直接通过URL调用Action类的任何公共方法。 通过理解和灵活运用`struts.xml`配置,开发者能够构建出高效、可维护的Struts2应用。同时,配合...

    struts.xml常用配置解析

    `&lt;include&gt;` 标签允许我们在主配置文件(通常是struts.xml)中引入其他XML配置文件。例如,有一个名为`newstruts.xml`的配置文件,里面包含了一个名为"demo"的包和一个名为"submit"的动作。在主配置文件中,我们可以...

    struts.xml详解.doc

    `struts-default.xml`通常包含了Struts2的默认配置,包括一些预定义的拦截器和Action。 4. **package标签**: `&lt;package&gt;`定义了一个行为模块,它是一系列Action的集合。每个`package`都需要一个唯一的名字,通过`...

    struts.xml详细说明.doc

    `struts.xml`遵循特定的XML结构,它以`&lt;struts&gt;`作为根元素,包含了多个`&lt;package&gt;`元素,每个`&lt;package&gt;`元素代表一个独立的包,可以看作是Action的分组。 2. **Action定义**: 在`&lt;package&gt;`内部,`&lt;action&gt;`...

    Struts.XML配置文件说明

    `&lt;package&gt;`标签定义了Struts2的行为包,它可以包含Action定义和拦截器配置。主要属性包括: 1. **name**: 必填属性,指定包的唯一名称,用于其他包引用。 2. **extends**: 可选属性,用于继承其他包,这样可以...

    struts.xml文件详解

    Struts.xml 文件是 Apache Struts 2 框架的核心配置文件,用于定义应用程序的行为、组织 Action、拦截器以及结果页面等。以下是该文件的主要组成部分和相关知识点的详细解释: 1. **DOCTYPE 声明**: DOCTYPE 声明...

    struts.xml详解[整理].pdf

    Struts.xml 文件是 Apache Struts 2 框架的核心配置文件,用于定义应用程序的行为、组织Action、拦截器以及结果页面等。以下是该文件中关键元素的详细解释: 1. **DOCTYPE声明**: - 第一行的DOCTYPE声明指定...

    Action的常用配置

    当应用变得复杂,Action数量增多时,可以将一个大的struts.xml拆分成多个小的配置文件,比如struts-mod1.xml,然后在主配置文件struts.xml中使用`&lt;include&gt;`标签来包含这些分模块的配置,这样可以实现配置文件的模块...

    struts2的资源配置

    在DTD(文档类型定义)中,可以看到struts.xml支持的元素,如`package`、`include`、`bean`和`constant`等,这些元素用于组织和配置Struts2的应用结构。 2. **包配置(Package)** - `package`元素是组织Action和...

    Struts2配置文件

    在开发过程中,通过`struts.properties`文件调整框架行为,而在`struts.xml`中详细定义Action和业务流程,可以实现高效且可维护的Java web应用。熟悉这两个配置文件,对于理解和优化Struts2应用至关重要。在实际开发...

    struts2的配置文件

    - **struts.xml**:这是最常用的配置文件,用户可以在此文件中定义包(package)、Action、拦截器等。 - **struts.properties**:主要用于配置Struts2的属性值,如常量配置等。 - **web.xml**:Web容器级别的配置...

    struts配置文件

    总结以上内容,Struts2的配置文件struts.xml是整个框架工作的核心,它通过&lt;package&gt;元素的配置实现了Action和拦截器的组织管理,属性解决了同名Action的冲突问题,而&lt;include&gt;标签则提供了配置的模块化和复用。...

    struts框架搭建

    主要包括`struts.xml`和`struts.properties`等。 ##### 1. 解决断网环境下配置文件提示问题 - **问题描述**:在断网环境下,IDEA中的`struts.xml`文件会出现红色叹号,无法获取到DTD验证信息,导致无法获得提示。 -...

    struts2.0.6+spring2.0.3+hibernane3的配置

    &lt;include file="struts-default.xml"/&gt; &lt;package name="default" extends="struts-default"&gt; &lt;default-interceptor-ref name="completeStack"/&gt; &lt;result name="login" type="redirect"&gt;login!default.action ...

    Struts2配置文件[文].pdf

    `name`属性是Action的唯一标识,如`name.action`。 - `class`属性指定Action类的全限定名,通常是继承自`ActionSupport`的类。 - `method`属性用于指定要执行的方法,动态方法调用可以基于请求参数动态决定。 - `...

    struts2学习笔记,总结了很多学习的经验

    通过理解并熟练掌握`web.xml`和`struts.xml`的配置、Action的定义、OGNL的使用以及标签库的运用,开发者可以高效地开发出健壮的MVC应用。不断学习和实践Struts2,将有助于提升你的Java web开发技能。

    struts2文件上传

    &lt;include file="struts-default.xml"&gt;&lt;/include&gt; &lt;constant name="struts.i18n.encoding" value="GBK"&gt; &lt;!--设置临时上传目录--&gt; &lt;constant name="struts.multipart.saveDir" value="d:\"&gt;&lt;/constant&gt; &lt;package ...

    Struts2的简单使用

    从Struts1.x迁移到Struts2,开发者需要理解两者之间的差异,比如配置方式的变化、Action和结果处理的不同,以及新引入的拦截器和AOP概念。虽然Struts2的学习曲线可能较陡峭,但其带来的优势,如更灵活的配置、更强大...

    2012struts2读书笔记

    在Struts2中,`&lt;package&gt;`元素用来组织和配置相关的Action。`name`属性定义了包的唯一标识,不一定要与Java包名对应。`namespace`属性定义了Action的命名空间,用于区分不同的功能模块。`extends`属性则指定了当前包...

Global site tag (gtag.js) - Google Analytics