struts2使用配置文件来初始化它的资源。
struts.xml包含三部分:
1、管理元素,包括:
Bean Configuration
Constant Configuration
Package Configuration
Namespace Configuration
Include Configuration
2、请求处理元素,包括:
Interceptor Configuration
Action Configuration
通配符映射(widecard mapping)
Result Configuration
Unkown Handle
3、错误处理元素,包括:
Exception Configuration
现在来对每一部分详细的说明:
Bean Configuration:
内在的,struts框架使用自己的依赖注入容器。容器负责加载主要的框架对象,所以struts框架的任何一个部分都可以以一种标准的、一致的方式被替换、扩展和移除。
bean元素只有一个必须的“class”属性,用来定义被创建的JAVA类。bean的用途有两个:
1、被框架容器创建,并且注入到内部框架对象中(个人理解,用来实现框架内部的接口)
2、有值,可以通过它的静态方法访问
bean元素的属性包括:
bean元素举例:
<struts> <bean type="com.opensymphony.xwork2.ObjectFactory" name="myfactory" class="com.company.myapp.MyObjectFactory" /> ... </struts>
Constant Configuration:
constants提供了一种简单的方法,通过修改键(key)的设置,修改框架和plugin的行为,从而达到自定义strtus应用的目的。
对于constants来说,有两个重要的用途:
1、用来修改一些设置,例如最大的上传文件的大小,或者定义struts框架是否在“开发模式”下
2、在一种类型的众多实现中,定义哪一种bean实现被选中
constant可以定义在下列文件中,并且以下列的顺序被搜素,后面文件中的定义可以覆盖前面的定义:
1、struts-default.xml
2、struts-plugin.xml
3、struts.xml
4、struts.properties
5、web.xml
constant 在struts.xml中的举例:
<struts> <constant name="struts.devMode" value="true" /> ... </struts>
在struts.properties中的举例:
struts.devMode = true
在web.xml中的举例:
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <init-param> <param-name>struts.devMode</param-name> <param-value>true</param-value> </init-param> </filter> ... </web-app>
Package Configuration:
使用package将逻辑上相关的一组action,result,interceptor等组件分为一组。
package配置只有一个必须的“name”属性,此属性作为以后对package的引用。“extends”属性是可选的,允许包集成一个或者多个其他package的配置。注意:配置文件是从上到下被处理,所以一个被继承的包必须在继承它的包的“前面”定义
Namespace配置:
namespace属性将action配置分成逻辑模块,每个模块都有自己的标识性前缀。namespace避免了action命名冲突。
namespace有以下几种:
1、default namespace:
默认的namespace属性为"",空字符串。
default namespace被当做一个全方位的namespace。如果一个action配置在定义的namespace中没有找到,就会从default namespace中去搜索。
2、root namespace
根root namespace "/"
namespace的工作原理举例:
<package name="default"> <action name="foo" class="mypackage.simpleAction"> <result name="success" type="dispatcher">greeting.jsp</result> </action> <action name="bar" class="mypackage.simpleAction"> <result name="success" type="dispatcher">bar1.jsp</result> </action> </package> <package name="mypackage1" namespace="/"> <action name="moo" class="mypackage.simpleAction"> <result name="success" type="dispatcher">moo.jsp</result> </action> </package> <package name="mypackage2" namespace="/barspace"> <action name="bar" class="mypackage.simpleAction"> <result name="success" type="dispatcher">bar2.jsp</result> </action> </package>
例1:如果request的地址是/barspace/bar.action,那么会在barspace命名空间中找bar action。如果找到,就会执行该action。如果没有找到,就会到default namespace中查找。在上面的例子中,bar action确实存在在barspace控件中,所以他会被执行,如果返回success,则会被跳转到bar2.jsp。
例2:如果request的地址是/barspace/foo.action,会在barspace空间中查找foo action。本例中,在barspace空间中没有foo action,所以它会到default空间中查找,找到后执行。如果返回success,会被跳转到greeting.jsp。
例3:如果request地址是/moo.action,会在root空间中查找moo action,如果没有找到,会到default空间中查找。
注意:namespace不是一个像文件路径一样的分级,它只有一个级别。例如request的地址是/barspace/myspace/bar.action,首先会在/barspace/myspace空间中查找bar action,如果没有找到,直接到default空间中查找bar action
Include Configuration:
struts框架允许使用include元素对配置文件“分而治之”
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <include file="Home.xml"/> <include file="Hello.xml"/> <include file="Simple.xml"/> <include file="/util/POJO.xml"/> <include file="/com/initech/admin/admin-struts.xml"/> </struts>
每个被include的配置文件都和struts.xml一样的格式。