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

web应用程序中我们都是使用部署描述符来初始化一些资源如servlet、过滤器、监听器等等,这个部署描述符就是那广为人知的web.xml了。同样的,框架也使用一个配置文件来初始化它自己的资源,这些资源主要包括:

1.拦截器(Interceptor):对请求进行预处理和后加工;

2Action Classes:负责调用商业逻辑和数据访问层;

3Results:负责返回视图(view),如JSP页面等等;

只有单独一个配置文件(struts.properties)来控制应用程序的运行时行为,在 运行前,配置是通过一个或多个xml文件来定义的,包括那个默认的struts.xml文件。可供配置的元素有:packagenamespaceincludeactionresultinterceptorexception等。这些元素按照功能的不同可以分为:管理层元素(Administrative Elements)、请求处理元素(Request Handling)、错误处理元素(Error Handling)。下面对其分别进行介绍。

1.配置Bean元素

通常框架会使用它自己的“依赖注入”(dependency injection)容器,这个容器会装载那些关键的框架对象,这样框架的任何部分都能够 以一种标准、一致的方式被取代、扩展或者除去 (这段话的意思我不是很明白) 。尤其是插件,可以通过这种方式对框架进行扩展,使它能够支持第三方的类库如SpringSiteMesh。通常情况下,大多数应用都不需要配置它。

Bean元素的所有属性信息如小表所示:

1bean元素属性信息一栏表

属性名称

是否必须

描述

class

bean的类名

type

bean实现的主要接口

name

bean的名字,必须唯一

scope

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

static

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

optional

Bean是否可选

这里有一点应说明,关于beanname属性的唯一性问题,它是指不允许两个beantype属性相同并且name属性也相同,也就是说在所有type相同的bean中,必须确保name属性的唯一性。这点我们在struts-default.xml中看到,有好几个beanname都是”struts”,但是它们的type属性不同。bean的主要功能有两点

      被框架容器创建然后注入到内部的框架对象中去

      将值注入它的静态方法(这个我还不是很能理解)

第一个作用可以称为对象注入,它通常要用到beantype属性,告诉容器这个对象

实现了哪个接口;第二个作用可以称为值注入,它有利于那些不是由容器创建的对象检索框架常量。使用值注入的对象必须定义”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

3xml文件的格式是一样的,因为它们使用同一个DTD文件,在xml文件中Constant元素有两个必须的属性:namevalue;在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>

3package配置

packages为我们提供了一种将actionresult,拦截器聚集成一个逻辑单元的简单方式。package元素的属性列表如下图所示:

2package元素属性一览表

属性名

是否必须

描述

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”。所谓家族链就是说要追溯它的父包,祖父包,直至它的一世组包,不过通常状况下不会有这么多代咯,我们都会直接把packageextends属性设置为”struts-default”

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值