dwr.xml 配置文件详解

1.创建dwr.xml 配置文件 
任何一个dwr.xml的文件都须要包含DWR DOCTYPE的声明行,格式以下: 
javascript

Xml代码  收藏代码java

  1. <!DOCTYPE dwr PUBLIC  
        "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"  
        "http://www.getahead.ltd.uk/dwr/dwr10.dtd">  
    //整个配置文件的大致结构以下:  
    <dwr>  
      <init>  
        <creator id="..." class="..."/>  
        <converter id="..." class="..."/>  
      </init>  
      <allow>  
        <create creator="..." javascript="..." scope="...">  
          <param name="..." value="..."/>  
        </create>  
        <convert convertor="..." match="..."/>  
      </allow>  
      <signatures>  
        ...  
      </signatures>  
    </dwr>

有几个术语有必要理解,参数叫作converted,远程Bean叫作created.若是远程Bean A有个方法A.blah(B),那么你须要为A创建一个created,为B创建一个converted. 

配置文件init部分声明那些用于创建远程bean和在方法调用中转换bean的类.这部分是可选择性配置的,多数状况下能够没必要使用它,若是你想定义一个新的creator或者converter那么就必须在部分中声明,but do double check on the ones that are currently available first. 
在init部分的做用是告诉DWR一些类实例和关于这些类怎样运行的信息.实际上并不会使用.这有点向java中的import语句,多数类在使用以前须要引入,但引入了类并不意味着这些在使用,每一个creator和converter须要有个id属性来容许之后进行引用. 
配置文件的allow部分定义哪些类能够创建和转换,每一个被准许的类均可以有一个'create'或者'convert'配置行.下面列出的类的转换在默认状况下不须要进一步的设置. 
  一、全部基本类型,boolean,int,double等等 
  二、基本类型的对象形式实现的类,Boolean,Integer等等 
  三、java.lang.String 
  四、java.util.date 和三个SQL形式的派生类 
  五、以上全部类型的数组形式 
  六、以上全部类型的集合,List,Set,Map(有些局限性) 
However nothing is added to the list of classes that can be created (i.e. put up for remoting) without you declaring it. 

2The Converters 

DWR已经默认定义和初始化了经常使用的Converter,他们分别以下: 
程序员

Xml代码  收藏代码ajax

  1. <converter id="null"  
        class="uk.ltd.getahead.dwr.convert.NullConverter"/>  
    <converter id="primitive"  
        class="uk.ltd.getahead.dwr.convert.PrimitiveConverter"/>  
    <converter id="bignumber"  
        class="uk.ltd.getahead.dwr.convert.BigNumberConverter"/>  
    <converter id="string"  
        class="uk.ltd.getahead.dwr.convert.StringConverter"/>  
    <converter id="date"  
        class="uk.ltd.getahead.dwr.convert.DateConverter"/>  
    <converter id="array"  
        class="uk.ltd.getahead.dwr.convert.ArrayConverter"/>  
    <converter id="map"  
        class="uk.ltd.getahead.dwr.convert.MapConverter"/>  
    <converter id="collection"  
        class="uk.ltd.getahead.dwr.convert.CollectionConverter"/>  
    <converter id="bean"  
        class="uk.ltd.getahead.dwr.convert.BeanConverter"/>  
    <converter id="hibernate"  
        class="uk.ltd.getahead.dwr.convert.HibernateBeanConverter"/>  
    <converter id="dom"  
        class="uk.ltd.getahead.dwr.convert.DOMConverter"/>  
    <converter id="dom4j"  
        class="uk.ltd.getahead.dwr.convert.DOM4JConverter"/>  
    <converter id="jdom"  
        class="uk.ltd.getahead.dwr.convert.JDOMConverter"/>  
    <converter id="xom"  
        class="uk.ltd.getahead.dwr.convert.XOMConverter"/>  
    <converter id="servlet" class="uk.ltd.getahead.dwr.convert.ServletConverter"/>

这里仅仅是定义了Converter而且简单的放在<convert….>元素以内,任何的<convert….>元素内容都有两个必须定义的属性.一个是对converter定义的引用和converter可以转换的类. 
例如最简单的converter是null converter,它做用是把null和void值转换成javascript的null和undefined值.它是全部converter中最简单的,就象调用java的静态方法同样,因此并不须要建立对象. 
默认的时候DWR将java void值转换成javascript的null值就是这样设置<convert converter="null" match="void"/>. 有时java.lang.Void也须要进行这样的转换,因此设置也是类似的<convert converter="null" match="java.lang.Void"/>.从java中传递null值到javascript是没有任何危险性的,因此DWR将这个做为默认的converter,因此你本身不用再把这个converter添加到配置文件的<allow>部分中去. 
基本类型的converter转换int,boolean,double等.固然还包括对应的对象形式Integerv,Boolean等等.DWR中在allow预约义了16个配置项目分别用于全部基本类型的转换.就象这样<convert converter="primitive" match="java.lang.Long"/><convert converter="primitive" match="long"/>. 
String类型和Date一样预先定义了Converter,这些converter都没有办法进行改变的,全部的String,Date和数值类型都统一采用默认的converter. 
2.1 Array Converters 
Array的配置项目没有上面介绍的那么直观,默认状况下DWR装载全部的基本类型和可装载的对象,这些包括String,Date等先前介绍的类型.java高级程序员可能会理解为何match的这行有点奇怪. 
spring

Xml代码  收藏代码shell

  1. <convert converter="array" match="[Z"/>  
    <convert converter="array" match="[B"/>  
    <convert converter="array" match="[S"/>  
    <convert converter="array" match="[I"/>  
    <convert converter="array" match="[J"/>  
    <convert converter="array" match="[F"/>  
    <convert converter="array" match="[D"/>  
    <convert converter="array" match="[C"/>  
    <convert converter="array" match="[L*"/>


*符号在上面没有提到,其实这是个能够表示任何字符的通配符号.这些数组可装载的的类型和其余可装载的类型是同样的. 
2.2 Bean Converters一种不能采用默认方式定义的converter就是Bean Converter,这个是将POJO对象转换成javascript相关的数组,反向也同样.基于安全因素的考虑这种类型的converter不能采用默认的方式实现. 
假设有个bean而且经过<create ...>语句设置成远程可用,有种类型的参数他自己是一个带有setter的java bean,但setter会产生严重的隐患.攻击者可能促使这隐患的发生.经过下面的语句就能够设置但个类的bean converter 
<convert converter="bean" match="your.full.package.BeanName"/> 
要想容许转换指定包或子包下全部类的转换能够按照下面的设置 
<convert converter="bean" match="your.full.package.*"/> 
很明显,能够采用下面的方式来转换全部的java bean 
<convert converter="bean" match="*"/> 
2.3 Restricting Property Conversion(指定属性转换) 
将象用exclude和incluce来通知DWR隔离creator的方法同样,converter也有一个相似的配置方法.由于指定属性转换只有针对bean才有效(基本类型的转换没有必要指定属性),这个功能只能应用与特定的converter即BeanConverter和从次类派生的全部类.相关配置语法以下 
apache

Xml代码  收藏代码编程

  1. <convert converter="bean" match="com.example.Fred"/>  
      <param name="exclude" value="property1, property2"/>  
    </convert>

这样就能够限定DWR不能调用Fred对象的getProperty1()和getProperty2()方法,一般这被成为拒绝访问方式,固然你也能够采用下面的方式配置能够访问的方法(受权访问方式) 
<convert converter="bean" match="com.example.Fred"/> 
  <param name="include" value="property1, property2"/> 
</convert> 
较好的安全控制大部分都是采用受权访问方式. 
2.4 Collection Converters 
DWR最后两个默认的converter是Maps和Collections 
数组

Xml代码  收藏代码浏览器

  1. <convert converter="collection" match="java.util.Collection"/>  
    <convert converter="map" match="java.util.Map"/>

一般converter是采用递归方法转换集合中的全部对象. 
这里有两个地方须要注意: 
仅仅经过反射方法没有办法知道集合元素中的类型,因此上面的两个converter能将任何集合转换成相对javascript而言有意义的对象.然而没有办法将不一样的集合类类型分别采用不一样的转换方法.由于没有办法彻底自动进行转换,咱们能够应用dwr.xml文件的special signatures syntax配置部分设置类型的转换处理过程. 
2.5 DOM Objects 
DWR 自动将DOM、DOM4J、JDOM和XOM转换成DOM树,前面这几种类型都仅仅返回Document,Element,Node.DWR会自动将这些转换成浏览器DOM对象.一般在启动JDOM Converter时会有一个提示信息,除非你想采用JDOMconverter不然能够忽略. 
INFO: Missing classdef for converter 'jdom'. Failed to load uk.ltd.getahead.dwr.convert.JDOMConverter. Cause: org/jdom/Document 
由于DWR没有办法知道你是否采用jdom converter,因此提示信息是info级别.若是你想采用jdom converter,你必须很清楚地知道jdom converter是否能够被加载.这就是DWR保留上面的提示信息的缘由. 
3 The Creators 
DWR共有三种Creator,最简单的”new”是调用bean的默认构造函数建立实例.”scripted”容许采用其余脚本语言建立实例.如BeanShell.在远程bean的默认构造函数不能进行进一步配置的状况下这种类型的creator比较有用.”Spring”类型容许你经过spring建立实例. 
下面是关于creator的参考资料和配置参数说明. 
Creator Parameter User
new class 类的全名称(包括包路径)
scripted language BSF框架支持的脚本语言名称(BSF为apache项目)
scripted script 返回远程对象的脚本,脚本能够指定一些属性,多数状况下通常只设置param节点配置.属性不多设置.
spring Location* 任何以location开头的参数,每一个参数都是指定一个spring的配置文件,在参数没有设置的状况下DWR会去读取spring的全局的配置文件.
spring beanName 从配置文件中读取的bean的名称
“scope参数容许你配置creator的生命周期,共有如下几个选项:application,session,request,page.这些参数对于用过jsp或servlet的开发人员并不陌生. 
3.1 Uing static methods 
若是你想远程调用一个creator的静态方法,而且creator是new类型.由于调用远程bean的方法前DWR不会检测将要执行的方法是否是静态方法,若是是静态方法那么creator就不用建立.这种机制能够适用任何类型的creator,但new类型的creator是最简单配置的. 
3.2 Security 
Creator能够配置类的成员函数的访问权限.creator有受权访问(指明能够被访问的方法)和拒绝访问(指明不容许访问的方法)两种配置方式. 
若是要设置除了setWibble方法以外的全部方法都不可访问能够采用下面的设置. 

Xml代码  收藏代码

  1. <create creator="new" javascript="Fred">  
      <param name="class" value="com.example.Fred"/>  
      <exclude method="setWibble"/>  
    </create>

若是采用j2ee访问角色控制的模式 
<create creator="new" javascript="Fred"> 
  <param name="class" value="com.example.Fred"/> 
  <auth method="setWibble" role="admin"/> 
</create> 
3.3 The 'spring' Creator 
3.4 The 'new' Creator 
DWR已经默认定义了new creator. 
<creator id="new" class="uk.ltd.getahead.dwr.create.NewCreator"/>DWR已经将这配置到了内置的dwr.xml文件中,并不须要进行额外的配置. 
Creator经过调用类的默认的构造方法建立实例.应用new creator有如下几个优势: 
安全性    
生命周期比较短的creator能够获得更好的安全性,经过不一样的应用状况设置适合的生命周期. 
低内存开销 
在访问量比较大的状况下,能够不用担忧发生内存泄露的状况. 
配置一个creator的建立和远程方法调用设置: 

Xml代码  收藏代码

  1. <allow>  
      <create creator="new" javascript="Blah">  
        <param name="class" value="java.util.Date"/>  
      </create>  
      ...   
    </allow>

上面的配置信息表示将java.util.date提供给客户端调用,而且引用名称是Blash.当你在客户端调用Blash.toString(reply)时,后台将采用java.util.date的默认构造方法建立一个实例.而后调用实例的tostring方法.客户端的javascript将返回给reply对象(此时reply是java.util.date的字符串形式) 
3.5 The 'scripted' Creator 
DWR 已经默认配置了scripted creator配置, 
<creator id="script" class="uk.ltd.getahead.dwr.create.ScriptedCreator"/>这种类型的creator采用BSF执行脚本语言并返回bean.例如 

Xml代码  收藏代码

  1. <allow>  
      ...  
      <create creator="script" javascript="EmailValidator">  
        <param name="language" value="beanshell"/>  
        <param name="script">  
          import org.apache.commons.validator.EmailValidator;  
          return EmailValidator.getInstance();  
        </param>  
      </create>  
      ...  
    </allow>



4 Signatures in dwr.xml 
Signatures部分用于配置Collections中装载对象元素的类型.举个例子来讲:下面的java代码没有办法对List集合中的对象进行转换. 

Java代码  收藏代码

  1. public class Check  
    {  
      public void setLotteryResults(List nos)  
      {  
          ...  
      }  
    }


Singatures配置容许咱们对DWR要操做的对象类型进行配置.对于了解JDK5泛型编程的开发人员来讲下面的格式是很容易理解的. 

Xml代码  收藏代码

  1.   

  2. <signatures>  
      <![CDATA[ 
      import java.util.List; 
      import com.example.Check; 
      Check.setLotteryResults(List<Integer> nos); 
      ]]>  
    </signatures>


DWR有个专门用于解析上面配置语句的解析器,虽然上面的是JDK5中才有的特性,由于有解析器的缘由这也能够应用与JDK5以前的版本. 
解析规则是不可见的,但有两种例外状况. 
一种状况是由于DWR1.0的解析器中有个Bug,在有些场合会没法处理返回值的类型.因此应该要避免这种状况的发生. 
一种状况是由于解析器是一个语法宽松的解析器,他不象编译器同样对语法有很是严格的要求,全部有时可能一些重要的语句没有配置而没法事先发现. 

Xml代码  收藏代码

  1.  

  2. <signatures>  
      <![CDATA[ 
      import java.util.List; 
      Check.setLotteryResults(List<Integer>); 
      ]]>  
    </signatures>


DWR的未来版本可能会采用符合java官方规范的解析器,这样能够避免许多出错的状况. 
Signature部分只用于泛型参数到基本类型参数的转换,对于其余的类型DWR采用反射机制或运行时类型来肯定.在没有泛型参数的状况下能够不配置Signature. 

Java代码  收藏代码

  1. public void method(String p);  
    public void method(String[] p);

下面的就须要配置,由于反射机制没法完成次类功能. 

Java代码  收藏代码

  1. public void method(List<Date> p);  
    public void method(Map<String, WibbleBean> p);

下面能够不用配置,DWR能够自动完成转换. 

Java代码  收藏代码

  1. public void method(List<String> p);  
    public void method(Map<String, String> p);


下面能够不用设置,DWR能够采用运行时转换. 

Java代码  收藏代码

  1. public
     List<Date> method(String p);

有一个值得注意的地方是在javascript中全部对象的keys都是一个字符串,你也能够把其余对象做为keys.他们在使用以前都会转换成字符串形式.DWR1.x将采用这个特性来转换成String.之后对象的转换将会在服务器端完成. 

5 Scripting Introduction 
DWR生成的javascript代码和java代码很类似并经过dwr.xml配置输出.相比普通java异步调用之下,经过ajax生成远程接口和java 代码的最大挑战是AJAX异步功能. 
DWR经过引入一个回调函数,当数据从服务返回数据是调用这个函数。有两种推荐的方法使用回调函数。一在参数列表加入回调功能。二增长调用元数据对象调用。 
也能够将回调的功能放在参数列表的前头,可是不建议使用这样的用法,由于在处理自动HTTP对象时候会出现问题。这些方法通常会保持向后兼容。 
5.1 Simple Callback Functions 
假设有个下面的java方法。 

Java代码  收藏代码

  1. public class Remote  
    {  
        public String getData(int index) { ... }  
    }

在javascript中就能够如下面的方式引用。 

Js代码  收藏代码

  1. <script type="text/javascript"  
        src="[WEBAPP]/dwr/interface/Remote.js"> </script>  
    <script type="text/javascript"  
        src="[WEBAPP]/dwr/engine.js"> </script>  
    ...  
    function handleGetData(str)  
    {  
      alert(str);  
    }


Remote.getData(42, handleGetData); 
“42”只是一个传给getdata方法的参数。固然你能够采用下面的写法。 
Remote.getData(42, function(str) { alert(str); }); 
5.2 Call Meta-Data Objects 
另外一种使用回调功能的方法是指定一个回调功能选项或其余可选项。上面的例子就变成下面的形式。 

Js代码  收藏代码

  1. Remote.getData(42, {  
      callback:function(str) { alert(str); }  
    });


这个方法具备如下几个优势:能够依照你的编码习惯来编写程序,更重要的是容许你增长额外的调用选项。 
5.3 Timeouts and Handling Errors 
除了使用回调功能你还能够指定超时时限和错误处理方法。例如: 

Js代码  收藏代码

  1. Remote.getData(42, {  
      callback:function(str) { alert(str); },  
      timout:5000,  
      errorHandler:function(message) { alert("Oops: " + message); }  
    });
  2. 5.4   

Finding the callback method 
下面有几个实例来讲明回调功能各个参数选项的配置,由于javascript是不支持函数重载的。 
Remote.method({ timeout:3 }, { errorHandler:somefunc }); 
上面的两个参数一个是bean的参数一个是回调元数据对象。可是没有方法去区别这两种参数选项。在抛开特定的浏览器环境,咱们假设null==undefined,因此具备如下规则: 
若是一个函数的每一个调用都是回调函数,那么他就没有调用元数据对象,全部的参数都是普通java参数。 
若是一个最后一个参数具备一个回调功能,那么这个参数就是调用元数据对象。其他的就是普通java参数。 
若是第一个参数为null,咱们就认为没有回调功能。其他的就是普通java参数。此外还要检查最后一个参数是否为null,若是是则会给予提示信息。 
若是最后一个参数为null,则没有回调功能。 
还有一个不是很好的约定格式,要表示错误信息。 
6 Engin.js文件 
这个文件是DWR的引擎文件,他承担着把后台自动生成的javascript接口与前台调用之间的衔接责任。因此任何使用DWR的地方都须要这个文件。 
每一个使用DWR的页面都必须引入这个文件: 

Xml代码  收藏代码

  1. <script type='text/javascript'  
        src='/[YOUR-WEB-APP]/dwr/engine.js'>  
    </script>


6.1 Call Batching 
应用批量功能能够一次性调用多个远程bean方法,由于他是将多个调用作为一次请求,这就减小了与服务器的交互。能够减小许多的开销。 
一个批量方法调用以DWREngine.beginBatch()开始WREngine.endBatch()结束。当DWREngine.endBatch()被调用时就说明开始调用批量方法,DWR就将这些方法打包在一块儿做为一次请求发送给服务器。 
DWR会确保全部的方法都回被调用,因此使用批量功能是要注意是否提交了批量调用,若是没有提交批量调用那么这些须要调用的方法将永远排在调用队列中直到提交批量调用。 
注意:批量调用方法会有一些缺点,好比他不能在那些已经帮定在一块儿的方法调用顺序不能保证同步。 
例如全部的调用元数据对象的接管函数,超时设定,错误处理等的调用都是在批量的级别上,而不是在调用的级别上。若是一个批量调用含有两个不一样超时时间设定的方法,那么除了最后一个以外的全部其余方法的超时设定都被忽略。 
6.2 Call Ordering 
由于AJAX是个普通的异步远程方法调用模式,因此远程调用的返回结果的顺序可能和你发送请求的顺序不一致。DWREngine.setOrdered(boolean)方法容许你设置远程调用返回结果的顺序和你发送调用请求的顺序保持一致。DWR是经过一个远程方法调用已经结束后在发送下一个调用请求来实现这个功能的。 
通常状况咱们并不须要返回结果顺序和发送请求顺序保持一致。DWR默认是不保持一致的。 
提示:由于保持上面的顺序会对应用程序的性能和响应时间,若是其中的一个消息发生丢失那么浏览器可能会有意想不到之外状况发生。在使用这个功能的时候必须认真考虑是否真的有必要使用。一般比较好的方法是使用异步模式调用。 
6.3 Handling Errors and Warnings 
对于一些服务器端发生的错误或警告状况DWR都回调用默认的错误和警告方法而且传递一个相关信息,一般这些发生的错误和异常对于用户来讲是不可见的。 
下面这个方法主要用于以消息框的方式或者在状态栏里显示一个错误或警告的消息。 
要改变错误的处理方法可使用这个方法:DWREngine.setErrorHandler(function), 
改变警告的处理方法可使用这个方法:DWREngine.setWarningHandler(function). 
6.4 Remoting Hooks 
参考 DWREngine.setPreHook(function) and DWREngine.setPostHook(function). 
若是你想在执行远程方法调用以前或以后进行一些处理的话,你可使用上面的两个方法。上面参数中设置的目标方法必须是没有参数的。若是你想限制特定的组件在一次方法调用没有结束以前不容许再次调用,那么使用上面的方法将颇有用。 
Post 执行Hooks一般是设置pre-hooks,通常用来撤消先前的操做。关于Hooks的例子能够参照;DWRUtil.useLoadingMessage() 函数。 
6.5 Remoting Options(远程调用设置) 
关于DWR处理远程调用有若干个设置选项,Method和Verbs对于用户来讲是透明的,但对于不一样的浏览器可能会有影响。一般DWR会选择正确的方法处理,若是想饶过某些浏览器产生的影响这些参数设置将很是有用。 
DWREngine.setMethod(newmethod) 
设置Method的实际执行方法,但被设置的方法不能确保被调用。只是DWR首先会尝试调用这个方法。newmethod 必须是DWREngine.XMLHttpRequest 或着 DWREngine.IFrame. 
DWREngine.setVerb(verb) 
容许设置iframe 和 XMLHttpRequest提交数据时的方式,必须是POST或者GET,若是浏览器不支持POST形式,DWR会自动切换到GET方式。

相关文章
相关标签/搜索