dwr.xml 配置

dwr.xml是你用来配置DWR 的文件,默认是将其放入WEB-INF文件夹。
 
创建一个 dwr.xml 文件
dwr.xml有如下的结构:
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting
2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
 
<dwr>
  <!-- 仅当需要扩展DWR时才需要 -->
  <init>
    <creator id="..." class="..." />
    <converter id="..." class="..." />
  </init>
 
  <!-- 没有它DWR什么也做不了 -->
  <allow>
    <create creator="..." javascript="..." />
    <convert converter="..." match="..." />
  </allow>
 
  <!-- 有必要告诉DWR方法签名 -->
  <signatures>...</signatures>
</dwr>
 
3.2  <init>标签
这个初始化部分申明被用来创建远程beans 而且这个类能被用来以某种过程转换。大多数例子你将不需要
用它,如果你想去定义一个新的Creator 或者Converter,就要在此被申明。
 
在init部分里有了定义只是告诉DWR这些扩展类的存在,给出了如何使用的信息。这时他们还没有被使
用。这种方式很像Java中的import语句。多数类需要在使用前先import一下,但是只有import 语句并不
表明这个类已经被使用了。每一个creator 和converter都用id属性,以便后面使用。
 
  21 / 92
3.3  <allow>标签
allow部分定义了DWR能够创建和转换的类。
3.3.1  Creator
每一个在类中被调用的方法需要一个<create …>有若干类型的creator,使用“new”关键字或者Spring 框
架等。
 
create元素是如下的结构
 
<allow>
  <create creator="..." javascript="..." scope="...">
    <param name="..." value="..." />
    <auth method="..." role="..." />
    <exclude method="..." />
    <include method="..." />
  </create>
  ...
</allow>
 
1.  creator 属性
1).new:Java 用“new”关键字创造对象
是DWR默认的creator,如下所示
<create id="new"  class="org.directwebremoting.create.NewCreator"/>
  没有必要把它加入dwr.xml,它已经在DWR内部文件了。
 
  这个creator将使用默认构造器创建类的实例,以下是用new创建器的好处
 
  安全:DWR创造的对象生存的时间越短,多次调用中间的值不一致的错误机会越少。  
  内存消耗低: 如果你的站点用户量非常大,这个创造器可以减少VM 的内存溢出。
 
2).none: 它不创建对象,看下面的原因。 (v1.1+)
none创建器不创建任何对象,它会假设你不须要创建对象。有2个使用的原因:
 
  你可能在使用的scope不是"page"(看上面),并在在前面已经把这个对象创建到这个scope中了,
这时你就不需要再创建对象了。  
  还有一种情况是要调用的方法是静态的,这时也不需要创建对象。DWR 会在调用创建器之前先检
查一下这个方法是不是静态的。
 
对于上诉两种情况,你仍然需要class参数,用来告诉DWR它是在操作的对象类型是什么。
 
 
 
  22 / 92
3).  scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。 
要使用这个创造器,你需要把一些辅助库放到WEB-INF/lib文件夹下:比如BSF的 jar包 ,你要用
的脚本语言的jar包 。
 
new创造器在 DWR中已经默认声明了:
<creator id="script" class="uk.ltd.getahead.dwr.create.ScriptedCreator"/>
这个创造器用BSF来执行脚本得到Bean,例如:
 
<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>
 
script创造器有如下参数:
参数  DWR 版本  描述
language  1.0  脚本语言,字符串,例如'beanshell'. (必需)
script  1.0  要执行的脚本。  (必需,除非scriptPath 参数存在)
scriptPath  1.1  脚本文件路径。  (必需,除非script参数存在)
reloadable  1.1  是否检测脚本文件的改动,以重新加载  (可选, 默认true)
class  1.0  创造出对象的类型(可选). 如果没有DWR 通过创造器得到类型。
 
注意:
 
当一个类是用script创造出来的,并且scope是session 或application,如果你的脚本改变,session中的
类和script中的类就不一致了。这样会出现错误。虽然 web 容器不用重启,但是用户需要先登出(或以某种
方式清空session),然后再登录。
当clazz参数不为空,并且用来创造新实例,DWR简单的调用  class.newInstance() 方法。这种方法是没
问题的,除非脚本正在用某个参数创建一个类,或者调用某个函数来配置这个类。 不幸的是,每次请求都
要重新运行script并造成上面的问题。
 
 
  23 / 92
4). spring: 通过 Spring 框架访问 Bean。
详情请见DWR与Spring整合
 
5). jsf: 使用 JSF的 Bean。 (v1.1+)
详情请见DWR与JSF整合
 
6). struts: 使用 Struts 的 FormBean。 (v1.1+)
详情请见DWR与Struts整合
 
7). pageflow: 访问 Weblogic 或Beehive 的PageFlow。 (v1.1+)
详情请见DWR与Weblogic 或Beehive 的 PageFlow整合
 
8). ejb3:使用 EJB3 session bean。(v2.0+)
一个正在实验的创造器,用来访问EJB Session beans。直到进行更多的测试和正式的维护,否则还
不能作为产品被使用。
 
如果你想写自己的creator,你必须在<init>里注册它。
 
2.  javascript 属性
在浏览器里给你创建的对象命名。避免使用JavaScript 保留字。这个名字将在页面里作为js被导入,就像
第2章节的那个jsp:
dwr.xml
<create creator="new" javascript="service">
  <param name="class" value="helloWorld.Service" />
</create>
 
html / jsp
<html>
  <head>

  <script type='text/javascript' src='dwr/interface/service.js'>

 
3.  scope 属性
和定义在servlet的scope一样大的范围,它允许你指定哪个bean是可以获得的。选项可以是: application,
session, request 和page。这些值应该已经被开发者们熟悉了。
 
scope选项是可选的,默认为page, 使用session请求cookies。目前,DWR还不支持URL重写。
 
 
 
  24 / 92
4.  param 元素
被用来指定创造器的其他参数,每种构造器各有不同。例如,"new"创造器需要知道要创建的对象类型是什
么。每一个创造器的参数在各自的文档中能找到。
5.  include 和 exclude 元素
允许一个创造器去限制进入类的方法。一个创造器必须指定include列表或exclude 列表之一。如果是
include列表则暗示默认的访问策略是"拒绝",include中的每个方法就是允许访问的方法;如果是exclude
列表则暗示默认的访问策略是"允许",exclude中的每个方法就是拒绝访问的方法。
比如:
 
<create creator="new" javascript="Fred">
  <param name="class" value="com.example.Fred" />
  <include method="setWibble" />
</create>
 
说明你只能在DWR中使用Fred的是setWibble方法。
 
6.  auth 元素
允许你指定一个J2EE的角色作为将来的访问控制检查:
 
<create creator="new" javascript="Fred">
  <param name="class" value="com.example.Fred" />
  <auth method="setWibble" role="admin" />
</create>
 
7.  使用静态方法
DWR会在调用创建器之前先检查一下这个方法是不是静态的,如果是那么创造器不会被调用。很显然这个
逻辑适用于所有创造器,尽管如此"null"创造器是最容易配置的。
 
8.  使用单例类
对于单例类的创建,最好适用BeanShell 和BSF来实例化对象。请参考scripted创造器。
 
9.  DWR 与 HttpSessionBindingListeners
DWR1.x中存贮已经创造的Bean的方法需要注意,它在每次请求时都会调用相同的  setAttribute() 方法。
就是说,如果一个Bean 在dwr.xml中的声明周期设置为session,再每次调用bean中的方法时,DWR
都会执行一次  session.setAttribute(yourBean) 。这看上去没有什么危害,但是如果你要使用servlet 的事
件机制的,就是说用了HttpSessionBindingListener 接口,你就会发现valueBound 和valueUnbound事件
在每次调用时都会发生,而不是你想像的在bean被创建时以及session过期时。
DWR2 只在第一次创建对象时调用  setAttribute() 。 
  25 / 92
3.3.2  Converter
我们需要确认所有的参数能被转换。 许多JDK提供的类型使你能够使用,但是你如果要转换你自己的代码,
就必须告诉DWR。一般是指JavaBean 的参数需要一个<convert…>标签作为入口。
 
你不需要在dwr.xml中<allow>部分的<convert>中定义。它们默认支持。
  所有主要的类型,boolean, int , double等等。
  包装类,Boolean, Integer等等。
  java.lang.String
  java.util.Date 和  java.sql.Times,java.sql.Timestamp。
  数组(存放以上类型的)
  集合类型  (List, Set, Map, Iterator 等等) (存放以上类型的)
  DOM对象(来自于DOM, XOM, JDOM 和DOM4J)
 
1.  日期转换器
如果你有一个String(例如:“2001-02-11”)在Javascript,你想把它转换成Java日期。那么你有 2种
选择,一是使用Date.parse()然后使用DataConverter 传入服务器端,还有一种选择是把该String传入,
然后用java 的 SimpleDateFormat(或者其他的)来转换。
 
同样,如果你有个Java的 Date类型并且希望在HTML使用它。你可以先用SimpleDateFormat 把它转换
成字符串再使用。也可以直接传Date给Javascript,然后用Javascript 格式化。第一种方式简单一些,尽
管浪费了你的转换器,而且这样做也会是浏览器上的显示逻辑受到限制。其实后面的方法更好,也有一些
工具可以帮你,例如:
  The Javascript Toolbox Date formatter   
  Web Developers Notes on Date formatting   
2.  数组转换器
数组实体不太容易理解。默认情况下DWR能转换所有原生类型的数组,还有所有marshallable 对象的数
组。这些marshallable对象包括前面介绍的String和Date 类型。match 属性看上去很怪。

<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*"/>
 
上面没有解释  * 的作用  - 它是通配符,表示匹配接下来的所有字符串。这也是DWR可以转换任意类型的
数组的原因。  
 
  26 / 92
3.  bean 和对象转换器
两个没有默认打开的转换器是Bean 和  Object 转换器。Bean转换器可以把POJO 转换成Javascript 的
接合数组(类似与Java中的Map),或者反向转换。这个转换器默认情况下是没打开的,因为 DWR要获得
你的允许才能动你的代码。
 
Object转换器很相似,不同的是它直接应用于对象的成员,而不是通过getter和setter方法。下面的例子
都是可以用object来替换bean的来直接访问对象成员。
 
如果你有一个在  <create ...> 中声明的远程调用Bean。它有个一参数也是一个bean,并且这个bean 有
一个setter存在一些安全隐患,那么攻击者就可能利用这一点。
 
你可以为某一个单独的类打开转换器:
 
<convert converter="bean" match="your.full.package.BeanName"/>
 
如果要允许转换一个包或者子包下面的所有类,可以这样写:
 
<convert converter="bean" match="your.full.package.*"/>
 
显而易见,这样写是允许转换所有的JavaBean:
 
<convert converter="bean" match="*"/>
 
  BeanConverter 和  JavaBeans 规范
用于被BeanConverter转换的Bean必须符合JavaBeans的规范,因为转换器用的是Introspection,
而不是Reflection。这就是说属性要符合一下条件:有getter和setter,setter有一个参数,并且这个
参数的类型是getter的返回类型。setter应该返回void,getter应该没有任何参数。setter 没有重载。
以上这些属于常识。就在eclipse里自动为每个属性添加setter,getter那种类型,如果你用的不是
JavaBean,那么你应该用ObjectConverter.
 
  设置 Javascript 变量
DWR可以把Javascript对象(又名maps,或联合数组)转换成JavaBean 或者Java对象。例子:
 
public class Remoted {
  public void setPerson(Person p) {
    // ...
  }
}
public class Person {
  public void setName(String name) { ... }
  public void setAge(int age) { ... }
  // ...

  27 / 92
如果这个Remoted已经被配置成Creator 了,Persion类也定义了BeanConverter,那么你可以通过下面
的方式调用Java代码:
 
var p = { name:"Fred", age:21 };
Remoted.setPerson(p);
 
  限制转换器
就像你可以在creator的定义中剔出一些方法一样,converter也有类似的定义。
 
限制属性转换仅仅对于Bean有意义,很明显原生类型是不要需要这个功能的,所以只有
BeanConverter及其子类型(HibernateBeanConverter))有这个功能。
 
语法是这样的:
 
<convert converter="bean" match="com.example.Fred">
  <param name="exclude" value="property1, property2" />
</convert>
 
这就保证了DWR不会调用  fred.getProperty1() 和fred.getProperty2两个方法。另外如果你喜欢"白
名单"而不是"黑名单"的话:
 
<convert converter="bean" match="com.example.Fred">
  <param name="include" value="property1, property2" />
</convert>
 
安全上比较好的设计是使用"白名单"而不是"黑名单"。
 
  访问对象的私有成员
通过'object'转换器的参数的一个名为force 的参数,可以让DWR通过反射来访问对象私有成员。
 
语法是这样的:
 
<convert converter="object" match="com.example.Fred">
  <param name="force" value="true" />
</convert>
 
直到DWR1.1.3,这里有一个bug,public 的field反而不能被发现,所以你需要在public 成员上设置
force=true。 
  28 / 92
 
4.  集合类型转换器
有个两个默认的转换器,针对Map和 Collection:
 
<convert converter="collection" match="java.util.Collection"/>
 
<convert converter="map" match="java.util.Map"/>
 
一般来说这些转换器可以递归转换它们的内容。
 
但是也有两点不足之处:
 
  仅仅用反射机制是没有方法明确集合里面是什么类型的。所以这两个转换器不能把集合里面的东西转
换成有意义的Javascript对象。  
  不能明确是那种类型的集合。 虽然我们不能让他们自动的起作用,我们可以在 dwr.xml中用
signatures语法声明它们类型,使之正确转换。
 
5.  枚举类型转换器
枚举类型转换器默认是没有打开的。它在Java5中的Enum和Javascript 的String之间进行转换。这个转
换器默认关闭是因为DWR 要在转换你的代码之前得到你的同意。
 
枚举类型转换器是DWR 1.1 版以后才支持的。
 
你可以这样设置来打开这个转换器:
 
<convert converter="enum" match="your.full.package.EnumName"/>
 
设置Javascript,一个简单的例子。假设你有下面的Java 代码:
 
public class Remoted {
  public void setStatus(Status p) {
    // ...
  }
}
enum Status {
  PASS, FAIL,
}
 
如果Remoted 类已经配置好Creator,并且 Status枚举类型已经设置了EnumConverter。那么你就可以
在javascript 中这样调用:
 
Remoted.setStatus("PASS"); 
  29 / 92
6.  DOM 对象
DWR可以自动转换来之DOM,DOM4J,JDOM 和 XOM 的 DOM树。你可以简单得用上面这些类库返回一
个Document、Element或者 Node,DWR 会把他们自动转换成浏览器的DOM对象。
 
在程序启动的时候会有一个常见的关于JDOM转换器的警告,你可以放心的忽略它,除非你要用JDOM: 
 
INFO: Missing classdef for converter 'jdom'. Failed to load
uk.ltd.getahead.dwr.convert.JDOMConverter. Cause: org/jdom/Document
 
因为DWR没有办法知道你是否想用JDOM,所以这个信息设在INFO 级别的。
 
如果你曾经尝试过使用JDOM,你会意识到在这种情况下这个转换器不可用的  - 这也是我们显示这个信息
的原因。
 
exist-db.org,我相信DWR 能同exist-db 很好的工作,因为它是建立在W3C DOM 之上的,而DWR也支
持这个。 
  30 / 92
 

DWR.xml配置文件说明书 1、 建立dwr.xml 配置文件 任何一个dwr.xml的文件都需要包含DWR DOCTYPE的声明行,格式如下: 整个配置文件的大体结构如下: ... 有几个术语有必要理解,参数叫做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'配置.下面列出的类的转换在默认情况下不需要进一步的设置. 1、所有基本类型,boolean,int,double等等 2、基本类型的对象形式实现的类,Boolean,Integer等等 3、java.lang.String 4、java.util.date 和三个SQL形式的派生类 5、以上所有类型的数组形式 6、以上所有类型的集合,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. 2、 The Converters DWR已经默认定义和初始化了常用的Converter,他们分别如下: 这里仅仅是定义了Converter并且简单的放在元素之内,任何的元素内容都有两个必须定义的属性.一个是对converter定义的引用和converter能够转换的类. 例如最简单的converter是null converter,它作用是把null和void值转换成javascript的null和undefined值.它是所有converter中最简单的,就象调用java的静态方法一样,所以并不需要创建对象. 默认的时候DWR将java void值转换成javascript的null值就是这样设置. 有时java.lang.Void也需要进行这样的转换,所以设置也是相似的.从java中传递null值到javascript是没有任何危险性的,所以DWR将这个作为默认的converter,所以你自己不用再把这个converter添加到配置文件的部分中去. 基本类型的converter转换int,boolean,double等.当然还包括对应的对象形式Integerv,Boolean等等.DWR中在allow预定义了16个配置项目分别用于所有基本类型的转换.就象这样. String类型和Date同样预先定义了Converter,这些converter都没有办法进行改变的,所有的String,Date和数值类型都统一采用默认的converter. 2.1 Array Converters Array的配置项目没有上面介绍的那么直观,默认情况下DWR装载所有的基本类型和可装载的对象,这些包括String,Date等先前介绍的类型.java高级程序员可能会理解为什么match的这行有点奇怪. *符号在上面没有提到,其实这是个可以表示任何字符的通配符号.这些数组可装载的的类型和其他可装载的类型是一样的. 2.2 Bean Converters 一种不能采用默认方式定义的converter就是Bean Converter,这个是将POJO对象转换成javascript相关的数组,反向也一样.基于安全因素的考虑这种类型的converter不能采用默认的方式实现. 假设有个bean并且通过语句设置成远程可用,有种类型的参数他本身是一个带有setter的java bean,但setter会产生严重的隐患.攻击者可能促使这隐患的发生.通过下面的语句就可以设置但个类的bean converter 要想允许转换指定包或子包下所有类的转换可以按照下面的设置 很明显,可以采用下面的方式来转换所有的java bean 2.3 Restricting Property Conversion(指定属性转换) 将象用exclude和incluce来通知DWR隔离creator的方法一样,converter也有一个类似的配置方法.因为指定属性转换只有针对bean才有效(基本类型的转换没有必要指定属性),这个功能只能应用与特定的converter即BeanConverter和从次类派生的所有类.相关配置语法如下 这样就可以限定DWR不能调用Fred对象的getProperty1()和getProperty2()方法,通常这被成为拒绝访问方式,当然你也可以采用下面的方式配置可以访问的方法(授权访问方式) 较好的安全控制大部分都是采用授权访问方式. 2.4 Collection Converters DWR最后两个默认的converter是Maps和Collections 通常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方法之外的所有方法都不可访问可以采用下面的设置. 如果采用j2ee访问角色控制的模式 3.3 The 'spring' Creator 3.4 The 'new' Creator DWR已经默认定义了new creator. DWR已经将这配置到了内置的dwr.xml文件中,并不需要进行额外的配置. Creator通过调用类的默认的构造方法创建实例.应用new creator有以下几个优点:  安全性 生命周期比较短的creator可以得到更好的安全性,通过不同的应用情况设置适合的生命周期.  低内存开销 在访问量比较大的情况下,可以不用担心发生内存泄露的情况. 配置一个creator的创建和远程方法调用设置: ... 上面的配置信息表示将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采用BSF执行脚本语言并返回bean.例如 ... import org.apache.commons.validator.EmailValidator; return EmailValidator.getInstance(); ... 4 Signatures in dwr.xml Signatures部分用于配置Collections中装载对象元素的类型.举个例子来说:下面的java代码没有办法对List集合中的对象进行转换. public class Check { public void setLotteryResults(List nos) { ... } } Singatures配置允许我们对DWR要操作的对象类型进行配置.对于了解JDK5泛型编程的开发人员来说下面的格式是很容易理解的. <![CDATA[ import java.util.List; import com.example.Check; Check.setLotteryResults(List nos); ]]> DWR有个专门用于解析上面配置语句的解析器,虽然上面的是JDK5中才有的特性,因为有解析器的原因这也可以应用与JDK5之前的版本. 解析规则是不可见的,但有两种例外情况. 一种情况是因为DWR1.0的解析器中有个Bug,在有些场合会无法处理返回值的类型.所以应该要避免这种情况的发生. 一种情况是因为解析器是一个语法宽松的解析器,他不象编译器一样对语法有非常严格的要求,所有有时可能一些重要的语句没有配置而无法事先发现. <![CDATA[ import java.util.List; Check.setLotteryResults(List); ]]> DWR的将来版本可能会采用符合java官方规范的解析器,这样可以避免许多出错的情况. Signature部分只用于泛型参数到基本类型参数的转换,对于其他的类型DWR采用反射机制或运行时类型来确定.在没有泛型参数的情况下可以不配置Signature. public void method(String p); public void method(String[] p); 下面的就需要配置,因为反射机制无法完成次类功能. public void method(List p); public void method(Map p); 下面可以不用配置,DWR可以自动完成转换. public void method(List p); public void method(Map p); 下面可以不用设置,DWR可以采用运行时转换. public List 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方法。 public class Remote { public String getData(int index) { ... } } 在javascript中就可以以下面的方式引用。 ... function handleGetData(str) { alert(str); } Remote.getData(42, handleGetData); “42”只是一个传给getdata方法的参数。当然你可以采用下面的写法。 Remote.getData(42, function(str) { alert(str); }); 5.2 Call Meta-Data Objects 另一种使用回调功能的方法是指定一个回调功能选项或其他可选项。上面的例子就变成下面的形式。 Remote.getData(42, { callback:function(str) { alert(str); } }); 这个方法具有以下几个优点:可以依照你的编码习惯来编写程序,更重要的是允许你增加额外的调用选项。 5.3 Timeouts and Handling Errors 除了使用回调功能你还可以指定超时时限和错误处理方法。例如: Remote.getData(42, { callback:function(str) { alert(str); }, timout:5000, errorHandler:function(message) { alert("Oops: " + message); } }); 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的页面都必须引入这个文件: 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方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值