下面,我们讨论dwr.xml文件中的DWR配置事项。实际上,DWR提供了两种配置方法:Java5(或更高版本)注解和dwr.xml文件。两者完全可以互相替代,并且相互补充。简要说明一下dwr.xml文件的基本结构,如例,dwr.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://directwebremoting.org/schema/dwr30.dtd"> <dwr> <!-- 只有在扩展DWR自身时,才需要init --> <init> <creator id="..." class="..."/> <converter id="..." class="..."/> </init> <!-- 必须使用allow,否则dwr将不执行任何功能 --> <allow> <create creator="..." javascript="..." scope="..."> <param name="..." value="..."/> <auth method="..." role="..."/> <exclude method="..."/> <include method="..."/> </create> <convert converter="..." match="..."/> </allow> <!-- 当DWR不能设定所需的全部参数时,需要使用signatures --> <signatures> ... </signatures> </dwr>
1. 内置的创建器和转换器
首先,任何被远程访问的javaBean都需要一个创建器,它明白创建指定类型bean的全部细节。传给方法的参数,以及方法所返回的参数都需要一个转换器,它了解如何实现java类型和javascript类型相互转换的全部细节。
内置的DWR创建器:
创建器 | 说明 |
new | 使用java的new操作符。也许你使用它的频率最高。通过它,可以访问远程的任何类型的bean。但是与其它创建器不同,在发出远程调用之前不建立bean |
none | 不创建对象。适用于如下情形:1.对象已经存在。2.调用的是静态方法 |
spring | 通过spring框架访问bean |
jsf | 使用JSF的对象 |
struts | 使用struts ActionForm bean |
pageflow | 使用Beehive 或者 WebLogic提供的PageFlow |
boolean,byte,short,int,long,float,double,char,java.lang.Boolean,java.lang.Byte,java.lang.Short,java.lang.Integer,java.lang.Long,java.lang.Float ,java.lang.Double,java.lang.Character,java.math.BigInteger,java.math.BigDecimal ,java.lang.Strng,
用于转换数组的转换器 , 两个处理集合的转换器 ,即collection和map转换器
enum转换器,用于处理java枚举类型
bean转换器和object转换器,二者相似,它们都实现javabean和javascript关联数组之间的转化。但是又有区别,object转换器直接处理对象成员,而不通过get()和set()方法。
Date转换器,用于在javascript日期类型和各种java日期类型(java.util.Date、java.sql.Date、java.sql.Times,以及java.sql.Timestamp)之间互相转换
2.<init>元素
如果需要自定义创建器和转换器,就需要使用<init>元素。总体来说,创建一个类,用于实现DWR的自定义转换器的Converter接口或者创建器的Creator接口。然后,在<init>部分声明这个类,并赋予一个ID,以便在后面的配置中引用该类。
3.<allow>元素
下面,我们讨论<allow>元素。无疑,这是dwr.xml文件的重点,需要花费绝大部分的配置时间。在<allow>元素,可以告知DWR,需要哪些远程bean,自定义bean的参数和返回类型如何与javascript数据类型相互转化。
首先,在<allow>元素加入一个<create>元素。可以通过设定creater属性来指明采用哪个创建器,通常情况下会设定该参数的值为new。还需要设置javascript属性,这是在客户端代码中要交互的对象的名称。Scope属性设置是可选的,非常类似于在servlet编程时所处理的范围,有效值包括application、request、session和page。默认值是page,通常情况下也会选择这个值。请注意,session属性需要使用cookie或URL重写。
<param>元素是<create>的子元素,含有创建器正常工作所需的附加信息。每个创建器所需参数各不相同。例如,"new"创建器需要知道初始化哪个类,因此含有<param name="class" value="...">。当使用创建器时,我会介绍具体参数,但是你也可以浏览DWR网站上的DWR文档。
<auth>元素也是<create>的子元素,用来与J2EE容器管理安全性整合。
最后,<include>元素和<exclude>元素也是<create>的子元素,定义了允许或者禁止创建器使用的方法列表。这两个元素是互斥的,不能同进使用。因此,如果希望对某个类的默认访问策略是容许访问所有方法,那么应该在<exclude>中设定(不允许访问的)方法列表。相反地,如果希望默认访问策略为拒绝访问所有的方法,那么就在<include>中设置(容许访问的)方法列表。这样,你就能够更加细致地管理远程类的访问权限。
<convert>元素是<allow>的子元素,定义DWR可以采用哪种转换器实现特定类与javascript之间的相互转换。DWR提供很多内置的转换器,其中之一便是bean转换器。出于安全性考虑,在默认情况下会禁用这个转换器。简单地说,DWR的策略是:如果不显式地给出授权许可,代码将不允许被访问。因此,如果不显式地把某个类设置为允许远程访问,那么客户端就不能远程访问它。同样,如果不显式地把某对象设置为可以转换,那么就不能将它转换为任何其他对象。因此,如果想使用,必须在<allow>元素启用这个转换器,如:
<allow> <convert converter="bean" match="appMyBean"/> <create creator="new" javascript="ClassA"> <param name="class" value="app.ClassA"/> </create> </allow>
现在,DWR可以将MyBean实例转换为一个合适的javascript对象。同样,也可以反向转换。 match属性指定这个转换器的目标类。 也可以在此指定为一个包,这样会覆盖包中所有类。也可以使用通配符"*",这样就可以转换程序中所有的javabean。这么做时要非常慎重,因为有些方法可能会返回不希望客户端看到的对象。例如,有些方法本应为私有方法,却设置错了,这样就会返回包含敏感信息的内部数据结构。
4.<signatures>元素
dwr.xml文件中要讨论的最后一个元素是<signatures>。这是一个可选的元素,一般情况下不会用到。当DWR准备调用远程对象的某个方法时,需要一些反射机制来确定该方法所期望的输入参数类型和返回值类型,并由此确定采用什么转换器。然而,有时候通过反射机制无法获得信息。这时候,需要给DWR提供这种信息,这样就需要<signatures>元素。如 例: