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 属性,保持默认配置即可
分享到:
相关推荐
比如在大型项目中,可以将用户管理、商品管理和订单管理等不同的功能模块分别配置在不同的xml文件中(如user.xml、goods.xml和order.xml),然后通过struts.xml中的<include>标签将这些模块配置文件引入主配置文件中...
Struts2支持动态方法调用,允许不预先在`struts.xml`中定义Action,而是直接通过URL调用Action类的任何公共方法。 通过理解和灵活运用`struts.xml`配置,开发者能够构建出高效、可维护的Struts2应用。同时,配合...
`<include>` 标签允许我们在主配置文件(通常是struts.xml)中引入其他XML配置文件。例如,有一个名为`newstruts.xml`的配置文件,里面包含了一个名为"demo"的包和一个名为"submit"的动作。在主配置文件中,我们可以...
`struts-default.xml`通常包含了Struts2的默认配置,包括一些预定义的拦截器和Action。 4. **package标签**: `<package>`定义了一个行为模块,它是一系列Action的集合。每个`package`都需要一个唯一的名字,通过`...
`struts.xml`遵循特定的XML结构,它以`<struts>`作为根元素,包含了多个`<package>`元素,每个`<package>`元素代表一个独立的包,可以看作是Action的分组。 2. **Action定义**: 在`<package>`内部,`<action>`...
`<package>`标签定义了Struts2的行为包,它可以包含Action定义和拦截器配置。主要属性包括: 1. **name**: 必填属性,指定包的唯一名称,用于其他包引用。 2. **extends**: 可选属性,用于继承其他包,这样可以...
Struts.xml 文件是 Apache Struts 2 框架的核心配置文件,用于定义应用程序的行为、组织 Action、拦截器以及结果页面等。以下是该文件的主要组成部分和相关知识点的详细解释: 1. **DOCTYPE 声明**: DOCTYPE 声明...
Struts.xml 文件是 Apache Struts 2 框架的核心配置文件,用于定义应用程序的行为、组织Action、拦截器以及结果页面等。以下是该文件中关键元素的详细解释: 1. **DOCTYPE声明**: - 第一行的DOCTYPE声明指定...
当应用变得复杂,Action数量增多时,可以将一个大的struts.xml拆分成多个小的配置文件,比如struts-mod1.xml,然后在主配置文件struts.xml中使用`<include>`标签来包含这些分模块的配置,这样可以实现配置文件的模块...
在DTD(文档类型定义)中,可以看到struts.xml支持的元素,如`package`、`include`、`bean`和`constant`等,这些元素用于组织和配置Struts2的应用结构。 2. **包配置(Package)** - `package`元素是组织Action和...
在开发过程中,通过`struts.properties`文件调整框架行为,而在`struts.xml`中详细定义Action和业务流程,可以实现高效且可维护的Java web应用。熟悉这两个配置文件,对于理解和优化Struts2应用至关重要。在实际开发...
- **struts.xml**:这是最常用的配置文件,用户可以在此文件中定义包(package)、Action、拦截器等。 - **struts.properties**:主要用于配置Struts2的属性值,如常量配置等。 - **web.xml**:Web容器级别的配置...
总结以上内容,Struts2的配置文件struts.xml是整个框架工作的核心,它通过<package>元素的配置实现了Action和拦截器的组织管理,属性解决了同名Action的冲突问题,而<include>标签则提供了配置的模块化和复用。...
主要包括`struts.xml`和`struts.properties`等。 ##### 1. 解决断网环境下配置文件提示问题 - **问题描述**:在断网环境下,IDEA中的`struts.xml`文件会出现红色叹号,无法获取到DTD验证信息,导致无法获得提示。 -...
<include file="struts-default.xml"/> <package name="default" extends="struts-default"> <default-interceptor-ref name="completeStack"/> <result name="login" type="redirect">login!default.action ...
`name`属性是Action的唯一标识,如`name.action`。 - `class`属性指定Action类的全限定名,通常是继承自`ActionSupport`的类。 - `method`属性用于指定要执行的方法,动态方法调用可以基于请求参数动态决定。 - `...
通过理解并熟练掌握`web.xml`和`struts.xml`的配置、Action的定义、OGNL的使用以及标签库的运用,开发者可以高效地开发出健壮的MVC应用。不断学习和实践Struts2,将有助于提升你的Java web开发技能。
<include file="struts-default.xml"></include> <constant name="struts.i18n.encoding" value="GBK"> <!--设置临时上传目录--> <constant name="struts.multipart.saveDir" value="d:\"></constant> <package ...
从Struts1.x迁移到Struts2,开发者需要理解两者之间的差异,比如配置方式的变化、Action和结果处理的不同,以及新引入的拦截器和AOP概念。虽然Struts2的学习曲线可能较陡峭,但其带来的优势,如更灵活的配置、更强大...
在Struts2中,`<package>`元素用来组织和配置相关的Action。`name`属性定义了包的唯一标识,不一定要与Java包名对应。`namespace`属性定义了Action的命名空间,用于区分不同的功能模块。`extends`属性则指定了当前包...