客户浏览器index.jsp --> Tomcat服务器 --> 我们的应用 --> web.xml --> struts.xml --> HelloAction动作类和sayHello()动作方法 --> success.jsp
如下图所示:
struts2的体系结构图如下:
九、Struts2的配置文件的加载时机和加载顺序
加载时机:当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了。
加载顺序:default.properties --> struts-default.xml --> plugins配置 --> struts.xml --> struts.properties --> web.xml
1 default.properties struts2-core-2.5.16.jar\org\apache\struts2 不能修改
2 struts-default.xml struts2-core-2.5.16.jar 不能修改
3 strtuts-plugin.xml 在struts2提供的插件jar包中,名为struts2-convention-plugin-2.5.16.jar 不能修改
4 struts.xml 我们的应用中,该文件是web应用默认的struts配置文件 我们修改的:推荐修改这里
5 struts.properties 我们的应用中,该文件是Struts的默认配置文件 我们修改的
6 web.xml 我们的应用中,该文件是Web应用的配置文件 我们修改的,可以给过滤器配置参数
注意:
1、Struts2提供了两种配置的方式。一种是key=value的方式,即使用.properties文件。另一种是xml文件配置。我们推荐使用xml文件(因为它能描述层级关系)。
2、如果多个文件配置了同一个struts2常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值。
1、常用的常量
常量定义在了default.properties配置文件中,体现形式都是key=value。所有的struts2应用都会用到这些常量。
struts.i18n.encoding UTF-8 应用中使用的编码
struts.objectFactory.spring.autoWire name 和spring框架整合有关
struts.multipart.parser jakarta 指定文件上传用的组件
struts.multipart.maxSize 2097152 文件上传总文件大小限制:2M
struts.action.extension action 能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔。
struts.enable.DynamicMethodInvocation false 是否允许动态方法调用
struts.devMode false 是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。
struts.ui.theme xhtml 页面展示用的主题
2、在struts.xml中覆盖常量(即修改struts中default.properties定义的常量值)
3、依次类推,三个文件的配置如下图所示:
十一、Struts2中配置文件元素的详解 1、package元素: package元素:作用是定义一个struts的包,它是把配置文件按照面向对象的思想来管理。分模块开发。
即在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
name属性:指定包的名称。注意:包的名称在配置文件中唯一。
extends属性:指定当前包的父包。它是按照面向对象的思想管理的体现。
一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。
struts-default.xml 中定义着 struts-default 这个包。而 struts-default.xml 是在我们的 struts.xml 加载之前加载。
abstract属性:把包声明为一个抽象包。抽象包就是用来被继承的。
只有没有<action>元素的包,才能被定义为抽象包。
namespace属性:名称空间。当指定了名称空间之后,访问路径就变成了:
访问路径 = 名称空间 + 动作名称
当不指定该属性时,该属性有默认值,默认值是""。注意:不是"http://www.likecs.com/"!!!
名称空间的搜索顺序:
第一步:先去找对应的名称空间
在指定的名称空间下找到了:就执行第二步。
在指定的名称空间下没找到:按照名称空间结构向上追溯,一直到根名称空间,只要在任何一级找到了,就执行第二步。
第二步:找动作名称
先在指定的名称空间下,搜索对应的动作名称:找到了就执行动作类的动作方法。
在指定的名称空间下没找到对应的动作名称:就前往默认的名称空间下,找动作名称。注意:它只找动作名称。