struts.xml 配置详解之一 Bean 常量 包
1. Bean 配置
Struts2 是个可以扩展的框架,框架的核心组件都是可以配置的,这些组件可以通过Struts2 自身的依赖注入容器来装配。开发时可以自己编写组件来扩展框架功能,然后通过bean 元素来配置组件。
在struts-default.xml 文件定义了struts2 框架中可配置的组件。
bean 元素的属性
属性名称 | 是否必须 | 描述 信息 |
class | 是 | bean 的类名 |
type | 否 | bean 实现的主要接口 |
name | 否 | bean 的名字,在具有相同Type 属性的bean 中,该名字必须唯一 |
scope | 否 | bean 的作用域,是default,singleton,request,session,thread 中的一个 |
static | 否 | 是否注入静态方法,如果指定了type ,static 就不能为true |
optional | 否 | Bean 是否可选 |
1.1 、 Bean 的两种配置方法
1 、框架的IoC 容器创建bean 的实例,然后将该实例注入到框架的内部对象中。
第一种做法可以称为对象注入,它通常要用到bean 的type 属性,告诉容器这个对象实现了哪个接口。
如果自己创建了ObjectFactory ,则可以在struts-default.xml 中作如下配置:
代码清单 1 : struts.xml 片段
<struts>
<bean type="com.opensymphony.xwork2.ObjectFactory"
name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />
</struts>
2 、通过bean 的静态方法向bean 注入值
第二种做法使用值注入,允许不创建bean ,而让bean 接受框架的常量。Bean 使用值注入,必须使用static 属性,并将该属性设置为true 。
例如:struts-default.xml 文件中可以作如下配置:
代码清单 2 : struts-defaul.xml 片段
<bean class=“com.opensymphony.xwork2.ObjectFactory” static=“true”/>
1.2 、 Bean 配置总结
注:在实际开发中,很少使用<bean> 元素。原因是Struts2 本身提供的功能已经足够强大,因此没有必要去扩展或者替换Struts2 的核心组建 ,自然也就用不到配置<bean> 元素。
2. 常量配置
我们可以通过定义一些能够改变框架和插件行为的关键设置来定制我们struts 应用程序,而这些设置就是常量。
常量扮演了两个关键的角色:首先它们被用来覆盖一些原有的默认设置,例如上传文件的最大容量、框架是否处于开发模式等等;其次,常量还用来指定在一个类型(type) 的多个实现中,哪个bean 应该被选中。
constant 元素的属性
属性名称 | 是否必须 | 描述 信息 |
name | 是 | 常量的名字 |
value | 是 | 常量的值 |
2.1 、常量配置文件的优先级
常量可以定义在多个文件中,默认情况下我们按照下面的顺序来寻找常量,后面的将覆盖前面的设置 :
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
前3 个xml 文件的格式是一样的,因为它们使用同一个DTD 文件,在xml 文件中Constant 元素有两个必须的属性:name 和value ;在struts.properties 文件中,每一个entry 都被视为一个常量;在web.xml 文件中FilterDispatcher 的初始化参数被载入为常量。
2.2 、 3 种常量形式的示例
第一种:在struts.xml 文件中配置常量
代码清单 3 : struts.xml 片段
<struts>
<constant name="struts.devMode" value="true" />
</struts>
第二种:在struts.properties 文件中配置常量
代码清单 4 : struts.properties 片段
struts.devMode = true
第三种:在web.xml 文件中配置常量
代码清单 5 : web.xml 片段
<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>
3. 包的配置
Struts2 中的包类似于java 中的包,提供了将action 、resul t 、拦截器 和拦截器栈 组织成一个逻辑单元的一种方式,从而为你简化了维护工作,提高了重用性。
在struts.xml 文件中,与web 应用相关的设置都在包中定义,每一个包中都包含了将要用到的action 、result 、拦截器和拦截器栈。
package 元素的属性
属性名称 | 是否必须 | 描述 信息 |
name | 是 | 被其他包引用时的键(key :唯一标识,不允许同名 ) |
extends | 否 | 指定要扩展的包 |
namespace | 否 | 指定名称空间 |
abstract | 否 | 声明包为抽象的(在包中没有action 定义) |
注意:
由于包信息的获取是按照配置文件内容的先后顺序进行的,所以“父”包必须在“子”包之前定义 。
包定义的例子(节选自struts2 自带的showcase 例子)
代码清单 6 : struts.xml 片段
<!-- 定义一个名为 default 的包,
继承自 struts-default.xml 文件中定义的 struts-default 抽象包 -->
< package name = "default" extends = "struts-default" >
< interceptors >
<!-- 定义名为 crudStatck 的拦截器栈 -->
< interceptor-stack name = "crudStack" >
< interceptor-ref name = "checkbox" />
< interceptor-ref name = "params" />
< interceptor-ref name = "static-params" />
< interceptor-ref name = "defaultStack" />
</ interceptor-stack >
</ interceptors >
< action name = "date" class = "org.apache.struts2.showcase.DateAction"
method = "browse" >
< result name = "success" > /date.jsp </ result >
</ action >
</ package >
<!-- 定义一个名为 skill 的包,继承自先前定义的 default 的包 -->
< package name = "skill" extends = "default" namespace = "/skill" >
<!-- 设置默认的拦截器引用, crudStack 是从 default 包继承而来的 -->
< default-interceptor-ref name = "crudStack" />
< action name = "list"
class = "org.apache.struts2.showcase.action.SkillAction" method = "list" >
< result > /empmanager/listSkills.jsp </ result >
<!-- 设置 action 引用的拦截器,将覆盖默认的拦截器引用 -->
< interceptor-ref name = "basicStack" />
</ action >
</ package >
我的联系方式: 85337464
我的博客: http://coderdream.iteye.com