----------
这里介绍DWR提供的一个便捷工具,那就是 test/debug页 ,它可以直接在应用程序中使用。访问地址如例: http://localhost:8080/xxx/dwr/index.html,也就是: http://ip地址:端口号/项目名/dwr所映射的路径/index.html ,这样将会为你展示一个测试或debug页面。
在该页面的底部还给出了一些有用的提示,提示需要关注的各种情形。例如,对于重载方法的提示就很有用。正如该页面所述,因为javascript不支持重载方法(不存在真正的重载),所以在编写服务器端类时应明白这一点。
DWR之DWR的web.xml配置
----------
在web.xml中,我们的基本配置如下:
- <!-- The DWR Servlet... -->
- <servlet>
- <servlet-name>dwr-invoker</servlet-name>
- <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>dwr-invoker</servlet-name>
- <url-pattern>/dwr/*</url-pattern>
- </servlet-mapping>
几个常DWRServlet初始参数
crossDomainSessionSecurity | 设置成false,可以接受来自本程序之外的其他域的请求。注意,这样做会带来很大的安全威胁。因此,修改该参数时应该慎重,确保能够接受全部后果。默认值为true |
allowScriptTagRemoting | 远程脚本标签是一种ajax方法,可以将<script>标签动态加入到页面中,然后,浏览器会检索指定的javascript文件。该文件的形式是一个函数调用,其中以数据(一般为JSON或其他类似的数据结构),作为这个函数的参数。函数已经存在于页面中,因此实际上只是建立了一种资源调用机制,一旦资源插入到页面中,就会引发javascript回调函数的执行,传入所获取的数据。这是ajax中非常有价值的方法,原因在于它是实现跨域ajax调用的方法之一。把这个参数设置为true(默认值)。 |
debug | 设置为true,可以启用上述的test/debug页面。默认值为false。 |
activeReverseAjaxEnabled | 当该参数的值设置为true时,轮询和Comet反向Ajax技术会被启用。默认值是false。 |
maxPollHitsPerSecond | 当使用轮询反向Ajax时,允许的每秒最大请求数。默认值是40。 |
normalizeIncludesQueryString | 当使用反向Ajax时,具有不同查询字符串的页面也被认为是相同的页面。但是,对于某些网站,这种假设并不正确。把这个参数的值设置为true(默认值是false)。 |
DWR之DWR的dwr.xml配置
----------
下面,我们讨论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>
首先,任何被远程访问的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>
4.<signatures>元素
dwr.xml文件中要讨论的最后一个元素是<signatures>。这是一个可选的元素,一般情况下不会用到。当DWR准备调用远程对象的某个方法时,需要一些反射机制来确定该方法所期望的输入参数类型和返回值类型,并由此确定采用什么转换器。然而,有时候通过反射机制无法获得信息。这时候,需要给DWR提供这种信息,这样就需要<signatures>元素。如 例:
- <signatures>
- <![CDATA[
- import java.util.List;
- import app.SigTestClass;
- SigTestClass.convertNames(final List<String> inList);
- ]]>
- </signatures>