Struts 2 struts.xml详解(一)

 

概述

        Struts 2用配置文件(struts.xml)初始化它的资源。这些资源包括:

拦截器---用于预处理和后处理请求的拦截器
Action类---用于调用业务逻辑处理和数据访问代码的Action类
结果---可以用JavaServer Pages, Velocity 和 FreeMarker模板预览的结果

        在运行时,一个程序只有一个配置。这个配置是在运行前由一个或者多个的xml文件定义而成的,包括默认的struts.xml文件。可以配置的元素有:packages,namespaces, includes, actions, results, interceptors, 和 exceptions。

        Struts.xml是Struts2 框架的核心配置,它要放在web程序的classpath中。

        Struts 2 配置文件的特性:

        Struts.xml允许被拆分成几个小的文件,然后可以根据需要引进要包含的配置文件。例如:

 

<struts>  
    .....  
    ......  
    <include file="file1.xml"/>  
    <include file="file2.xml"/>  
    .....  
    .....  
</struts>  

         你甚至可以将struts-plugin.xml文件放在一个JAR包里,它会自动被加载到程序中。这有助于程序员开发自配置的组件。

 

        如果你想要使用其它框架如Freemaker和Velocity,这些模块也可以放到classpath中然后从classpath加载。这样开发人员就可以将所有的模块打包进一个JAR文件里。

Struts.xml文件结构

        先看一下一个简单的struts.xml文件。

<?xml version="1.0"encoding="UTF-8"?>  
<!DOCTYPE strutsPUBLIC  
 "-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN"  
 "http://struts.apache.org/dtds/struts-2.0.dtd">  
<struts>  
      <constant name="struts.enable.DynamicMethodInvocation"value="false" />  
      <constant name="struts.devMode"value="true" />  
  
      <package name="com.stuqbx.helloworld.action"namespace="/action" extends="struts-default">  
            <action name="HelloWorld"class="com.stuqbx.helloworld.action. HelloWorld">  
                  <result>/pages/HelloWorld.jsp</result>  
            </action>  
            <!-- Add actions here -->  
      </package>  
      <!-- Add packages here -->  
</struts>   

   

        Struts.xml是由Struts2.0 DTD定义的(DTD(Document Type Definition)用于定义文档的合法性。它定义了文档应该有哪些元素及其属性,还有其他一些约束性规则。 DTD语言定义的文档类型是SGML家族的标记性语言(包括SGML,XML,HTML))。Struts 2.0 DTD定义了struts.xml的结构和元素信息。附Struts 2.0 DTD文件。

 

<!-- Strutsconfiguration DTD. Use the following DOCTYPE <!DOCTYPE struts  
      PUBLIC "-//Apache SoftwareFoundation//DTD Struts Configuration 2.0//EN"  
      "http://struts.apache.org/dtds/struts-2.0.dtd">-->  
<!ELEMENT struts(package|include|bean|constant)*>  
<!ELEMENT package(result-types?, interceptors?,  
default-interceptor-ref?,default-action-ref?, global-results?,  
global-exception-mappings?,action*)>  
  
<!ATTLIST packag  
    name CDATA #REQUIRE  
    extends CDATA #IMPLIE  
    namespace CDATA #IMPLIE  
    abstract CDATA #IMPLIE  
    externalReferenceResolver NMTOKEN #IMPLIE  
>   
  
<!ELEMENT result-types(result-type+)>  
<!ELEMENT result-type (param*)>  
<!ATTLIST result-typ  
    name CDATA #REQUIRE  
    class CDATA #REQUIRE  
    default (true|false) "false  
>   
  
<!ELEMENT interceptors(interceptor|interceptor-stack)+>  
<!ELEMENT interceptor (param*)  
<!ATTLIST intercepto  
    name CDATA #REQUIRE  
    class CDATA #REQUIRE  
>   
  
<!ELEMENT interceptor-stack(interceptor-ref+)>  
<!ATTLIST interceptor-stac  
    name CDATA #REQUIRE  
>   
  
<!ELEMENT interceptor-ref(param*)>  
<!ATTLIST interceptor-re  
    name CDATA #REQUIRE  
>   
  
<!ELEMENTdefault-interceptor-ref (param*)>  
<!ATTLIST default-interceptor-re  
    name CDATA #REQUIRE  
>   
  
<!ELEMENT default-action-ref(param*)>  
<!ATTLIST default-action-re  
    name CDATA #REQUIRE  
>   
  
<!ELEMENT global-results(result+)>  
<!ELEMENTglobal-exception-mappings (exception-mapping+)>  
<!ELEMENT action (param|result|interceptor-ref|exception-mapping)*>  
<!ATTLIST actio  
    name CDATA #REQUIRE  
    class CDATA #IMPLIE  
    method CDATA #IMPLIE  
    converter CDATA #IMPLIE  
>   
  
<!ELEMENT param (#PCDATA)>  
<!ATTLIST para  
    name CDATA #REQUIRE  
>   
  
<!ELEMENT result(#PCDATA|param)*>  
<!ATTLIST resul  
    name CDATA #IMPLIE  
    type CDATA #IMPLIE  
>   
  
<!ELEMENT exception-mapping(#PCDATA|param)*>  
<!ATTLIST exception-mappin  
    name CDATA #IMPLIE  
    exception CDATA #REQUIRE  
    result CDATA #REQUIRE  
>   
  
<!ELEMENT include (#PCDATA)>  
<!ATTLIST includ  
    file CDATA #REQUIRE  
>   
  
<!ELEMENT bean (#PCDATA)>  
<!ATTLIST bea  
    type CDATA #IMPLIE  
    name CDATA #IMPLIE  
    class CDATA #REQUIRE  
    scope CDATA #IMPLIE  
    static CDATA #IMPLIE  
    optional CDATA #IMPLIE  
>   
  
<!ELEMENT constant (#PCDATA)>  
<!ATTLIST constan  
    name CDATA #REQUIRE  
    value CDATA #REQUIRED     
>    
 

 

        如果程序的功能不依赖于struts.xml可以将它彻底删除掉。有一些配置是可选的如:注释(annotations), web.xml启动参数(web.xml startupparameters), 和 变化的URL映射规则(alternate URL mapping schemes)。还有一些配置是需要struts.xml文件的支持的如:全局结果(global results), 异常处理(exception handling), 以及自定义拦截器栈(the custom interceptor stacks)。

Struts.xml分析

        <struts>标签是整个struts.xml的根。它之下还包含package,include, bean和constant标签。

1.  package标签

        Package用来将actions, results, resulttypes, interceptors, and interceptor-stacks等组成一组并分成一个逻辑单元。每个package是多个Action、多个拦截器、多个拦截器引用的集合。Package和object类似,可以被继承,被子package重载(覆盖)。

Package用来组合具有相同属性的配置如相同的拦截器栈或者相同的命名空间。

属性

是否必须

描述

name

yes

用于其他package引用的唯一标识

必须唯一

extends

no

继承其他package的配置(在此之前配置的package)

要被扩展的包名

namespace

no

提供从URL到package的映射

例如:在两个namespace属性分别为pack1和pack2包中,访问的URL就应该是?/webApp/pack1/my.action和?/webApp/pack2/my.action

abstract

no

描述此package是否是abstract的(不能定义action)

true/false

        注:配置文件是按顺序从头开始处理加载的,所以扩展package所引用的package必须在此之前就定义好的。

        配置示例:

<strut>  
            <!--struts2的action必须放在一个指定的包空间下定义 -->  
            <package name="default"extends="struts-default">  
                  <!-- 定义处理请求URL为login.action的Action -->  
                  <action name="login"class="com.stuqbx.helloworld.action.Login">  
                        <!-- 定义处理结果字符串和资源之间的映射关系 -->  
                        <resultnameresultname="success">/success.jsp</result>  
                        <resultnameresultname="error">/error.jsp</result>  
                  </action>  
            </package>  
</struts> 

  

2.  include标签

        include节点是struts2中组件化的方式。可以将每个功能模块独立到一个xml配置文件中,然后用include节点引用。它只有一个属性file,指定要引用的xml文件。这些引用的xml文件具有和struts.xml文件相同的结构。引用方式如下 :

<struts>  
            <include file="invoices-config.xml"/>  
            <include file="admin-config.xml"/>  
            <include file="reports-config.xml"/>  
</struts>  
 

        在include时,顺序很重要,因为配置信息是include之后才生效的。

        另外,有一些文件是隐式include的,这些文件有:struts-default.xml和struts-plugin.xml。这两个文件都包含默认的result types, interceptors, interceptor stacks,packages的配置也包含了web程序运行环境的配置信息(这些信息也可以在struts.properties中配置)。所不同的是,struts-default.xml提供了struts2的核心配置,而struts-plugin.xml提供了相关插件的配置信息。每个JAR插件都应该包含有一个struts-plugin.xml文件,他们在启动时被加载。

3.  bean标签

        大部分的程序都不需要扩展bean配置。Bean元素提供了class属性,用来指定用来创建和操作的Java类。一个bean可以被框架容器创建并注入到框架的内部对象中,或者被注入到静态方法中。

        第一种用法,对象注入,一般带有type属性,它告诉容器这个对象实现了那个接口。

        第二种用法,值注入,允许不是容器创建的对象接收框架传来的常量。但是,用来值注入的对象必须定义成静态属性。

属性

是否必须

描述

class

yes

Bean class的名字

type

no

类实现的主要java接口

name

no

Bean的唯一名字;必须在指定相同type的bean中唯一

scope

no

Bean的有效范围;必须是default, singleton, request, session, thread中的一个

static

no

是否注入静态方法;当type指定时,不能为true

optional

no

这个bean是否是可选的

        配置示例:

<struts>  
    <bean type="com.stuqbx.web.bean.ObjectFactory" name="factory"  
        class="com.stuqbx.web.bean.MyObjectFactory" />  
    ...  
</struts> 
 

4.  constant标签

        Constant有两个重要的应用:

        用来重新配置最大上传文件大小或者struts框架是否应该处于devMode(= development mode)模式。

        用来指定在多个实现给定type的bean中应该选择哪一个。

        Constants可以在多个文件中声明。默认的,constants是以下面的顺序搜索的,之后的覆盖之前的。

                struts-default.xml

                struts-plugin.xml

                struts.xml

                struts.properties

                web.xml

        在struts.properties文件中,每个条目都被认为是一个常量。在web.xml中,任何FilterDispatcher的初始化参数都是以常量被加载的。

属性

是否必须

描述

name

yes

常量的名字

value

yes

常量的值

        Struts2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射, 及Action处理结果和物理资源之间的映射关系。除此之外,Struts2框架还包含了一个struts.properties文件,该文件主义了Struts2框架的大量常量属性。但通常推荐也是在struts.xml文件中来配置这些常量属性。

        配置示例:

<struts>  
            ...  
            <constant name="struts.custom.i18n.resources"value="messages" />  
            <constant name="struts.devMode"value="true" />  
</struts>  
 

        以上指定了资源文件的放置在classes目录下,基本名是messages,则在classes目录下您就应该放置类似messages_zh_CN.properties,message_en.properties名的文件。并且指定struts的模式是devMode(=development mode)模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值