您的位置:首页 > 编程语言 > Java开发

Struts2学习:配置篇之管理层配置元素(一)

2007-09-05 15:06 447 查看
在web应用程序中我们都是使用部署描述符来初始化一些资源如servlet、过滤器、监听器等等,这个部署描述符就是那广为人知的web.xml了。同样的,框架也使用一个配置文件来初始化它自己的资源,这些资源主要包括:
1.拦截器(Interceptor):对请求进行预处理和后加工;
2.Action Classes:负责调用商业逻辑和数据访问层;
3.Results:负责返回视图(view),如JSP页面等等;
只有单独一个配置文件(struts.properties)来控制应用程序的运行时行为,在 运行前,配置是通过一个或多个xml文件来定义的,包括那个默认的struts.xml文件。可供配置的元素有:package、namespace、include、action、result、interceptor、exception等。这些元素按照功能的不同可以分为:管理层元素(Administrative Elements)、请求处理元素(Request Handling)、错误处理元素(Error Handling)。下面对其分别进行介绍。
1.配置Bean元素
通常框架会使用它自己的“依赖注入”(dependency injection)容器,这个容器会装载那些关键的框架对象,这样框架的任何部分都能够 以一种标准、一致的方式被取代、扩展或者除去 (这段话的意思我不是很明白) 。尤其是插件,可以通过这种方式对框架进行扩展,使它能够支持第三方的类库如Spring、SiteMesh。通常情况下,大多数应用都不需要配置它。
Bean元素的所有属性信息如小表所示:
表1:bean元素属性信息一栏表
属性名称
是否必须
描述
class

bean的类名
type

bean实现的主要接口
name

bean的名字,必须唯一
scope

bean的作用域,是default,singleton,request,session,thread中的一个
static

是否注入静态方法,如果指定了type,static就不能为true
optional

Bean是否可选
这里有一点应说明,关于bean的name属性的唯一性问题,它是指不允许两个bean的type属性相同并且name属性也相同,也就是说在所有type相同的bean中,必须确保name属性的唯一性。这点我们在struts-default.xml中看到,有好几个bean的name都是”struts”,但是它们的type属性不同。bean的主要功能有两点
● 被框架容器创建然后注入到内部的框架对象中去
● 将值注入它的静态方法(这个我还不是很能理解)
第一个作用可以称为对象注入,它通常要用到bean的type属性,告诉容器这个对象
实现了哪个接口;第二个作用可以称为值注入,它有利于那些不是由容器创建的对象检索框架常量。使用值注入的对象必须定义”static”属性。(不知哪有例子可以看一下,^_^)
下面给出一个简单的bean元素的例子,从struts-default.xml中摘录出来的:
<bean type="com.opensymphony.xwork2.ObjectFactory"
name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />
就我个人的理解,配置一个bean的作用就相当于告诉struts框架,在它启动的时候
由容器预先创建好这样一个对象,以供别的对象调用,就像spring中的IoC容器一样。
2.常量配置
我们可以通过定义一些能够改变框架和插件行为的关键设置来定制我们struts应用程序,而这些设置就是常量。常量扮演了两个关键的角色:首先它们被用来覆盖一些原有的默认设置,例如上传文件的最大容量、框架是否处于开发模式等等;其次,常量还用来指定在一个类型(type)的多个实现中,哪个bean应该被选中。
常量可以定义在多个文件中,默认情况下我们按照下面的顺序来寻找常量,后面的将覆盖前面的设置:
● 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的初始化参数被载入为常量。下面分别给出3中常量形式的例子。
struts.xml文件中常量
<struts>

<constant name="struts.devMode" value="true" />

</struts>

struts.properties文件中常量
struts.devMode = true

web.xml文件中常量
<filter>
<filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-clas s>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
</web-app>
3.package配置
packages为我们提供了一种将action,result,拦截器聚集成一个逻辑单元的简单方式。package元素的属性列表如下图所示:
表2:package元素属性一览表
属性名
是否必须
描述
name

package的唯一标识,不允许同名
extends

继承它所扩张包的行为
namespace

见后面的namespace配置
abstract

声明包为抽象包,无需配置任何action
上表中的extends属性允许一个包继承前面一个或多个包的配置,包括所有的拦截器、拦截器栈和action配置。要注意的是,配置文件是按照从上往下的顺序被处理的,也就是说如果一个package继承了另外一个package,那么它所继承的package必须要在它之前被定义。下面给出了一个package的样本:

<package name="employee" extends="struts-default" namespace="/employee">

<default-interceptor-ref name="crudStack"/>

<action name="list" method="list"

class="org.apache.struts2.showcase.action.EmployeeAction" >

<result>/empmanager/listEmployees.jsp</result>

<interceptor-ref name="basicStack"/>

</action>

<action name="edit-*"          class="org.apache.struts2.showcase.action.EmployeeAction">

<param name="empId">{1}</param>

<result>/empmanager/editEmployee.jsp</result>

<interceptor-ref name="crudStack">

<param name="validation.excludeMethods">execute</param>

</interceptor-ref>

 </action>

<action name="save" method="save"

    class="org.apache.struts2.showcase.action.EmployeeAction" >

<result name="input">/empmanager/editEmployee.jsp</result>

<result type="redirect">edit-${currentEmployee.empId}.action</result>

  </action>

<action name="delete" method="delete"

  class="org.apache.struts2.showcase.action.EmployeeAction" >

<result name="error">/empmanager/editEmployee.jsp</result>

<result type="redirect">edit-${currentEmployee.empId}.action</result>

 </action>

</package>

</struts>

关于这个extends属性我做了一下测试,我在package中配置了这个的一个action
<action name="HelloWorld" class="tutorial.HelloWorld" >
<result>/HelloWorld.jsp</result>
</action>
测试情况如下
◆ 不给package元素设置extends属性,此时应用加载失败,后台提示如下错误:
Error building results for action HelloWorld in namespace
◆ 给package元素设置一个extends属性,但是它指向一个并不存在的包,如下所示:
Extends=”121212”,此时应用加载成功,但是后台会提示Unable to find parent
packages 1212121。此时如果调用HelloWorld.action,系统会报如下错误:
There is no Action mapped for namespace / and action name HelloWorld
◆ 给package元素设置一个extends属性,它指向一个已存在的包,如果此包没有设置
extends属性那么就会出现第一种情况的错误。
总之,我们定义一个package的时候,最好是将它的extends属性设置为”struts-default”,
如果不是”struts-default”,那么我们要确保它的家族链上有一个包的extends属性为”struts-default”。所谓家族链就是说要追溯它的父包,祖父包,直至它的一世组包,不过通常状况下不会有这么多代咯,我们都会直接把package的extends属性设置为”struts-default”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐