public class Remoted {
public void setStatus(Status p) { // ... } }
enum Status { PASS, FAIL, }
如果Remoted类已经配置好Creator,并且Status枚举类型已经设置了EnumConverter。那么你就可以在javascript中这样调用: Remoted.setStatus(\如果没有匹配的类型,就会抛出异常。
DOM 对象(DOM Objects )
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也支持这个。
DWR 和 Hibernate(Hibernate整合)
让DWR和Hibernate正常工作的检查列表
1. 确保你使用的是最新的DWR。Hibernate转换器是新东西,所以你需要下载最新
的
2. 确保你已经明白开始指南上所写的内容。
3. 确保你的Hiberante在没有DWR的时候工作正常。 4. 如果是Spring和Hibernate一起使用,那么你最好先了解一下如何将整合Spring。 5. 配置DWR,使之与Hibernate一起工作。 (看下面)。
6. 查看演示页面:http://localhost:8080/YOUR-WEBAPP/dwr,确定Spring的
Bean可以出现。 HibernateBeanConverter
这个转换器同标准的BeanConverter非常相似,不同之处在于我们可以决定如何处理延迟加载。
使用HibernateBeanConverter可能会带来如下风险:
? ?
架构: HibernateBeanConverter不符合MVC模式,所以不能把对象在数据曾和表现曾之间进行隔离。这个风险可以通过在上面加上独立的bean来减轻。
性能: DWR试图通过相同的序列化方式来转换所有可以得到的属性(除了DWR仅仅读JavaBean属性的时候)。所以可能会出现通过HTTP序列化了你的整个数据的情况。通常这并不是你想要的。要减少这一风险可以使用
BeanConverter(HibernateBeanConverter衍生于它)的排除某些属性的功能:
HibernateBeanConverter会尝试不去读取没有初始化的属性。如果你只是想读取所有的东西那么应该使用BeanConverter。
建议使用Hibernate3,实际上Hibernate2一下的情况,你会发现你得到的都是空的Bean。
Session管理
如果你使用Hibernate对象,你需要知道每一个DWR请求都是一个新的Servlet请求,所以你需要保证为每个请求打开一个Hiberante的Session。
如果你用Spring,那么可以很方便的使用Spring里面的OpenSessionInViewFilter,它可以保证为每个请求打开一个Hiberante的Session。类似的解决方案在其它Framework中也存在。
Servlet Objects (HttpServletRequest, HttpSession, etc)
可选的init部分用来声明创造bean的类和转换bean的类。多数情况下你不需要用到他们。如果你需要定义一个新的Creator [JavaDoc] 和 Converter [JavaDoc] , 那么你就需要在这里定义他们。但是建议你现检查一下DWR是不是已经支持了。
在init部分里有了定义只是告诉DWR这些扩展类的存在,给出了如何使用的信息。这时他们还没有被使用。这中方式很像Java中的import语句。多数类需要在使用前先import一下,但是只有import语句并不表明这个类已经被使用了。每一个creator和converter都用id属性,以便后面使用。
dwr.xml中的签名(Signatures)
DWR使用反射来找出在转换时应该用那种类型。有时类型信息并不明确,这时你可以在这里写下方法的签名来明确类型
signatures段使DWR能确定集合中存放的数据类型。例如下面的定义中我们无法知道list中存放的是什么类型。
public class Check {
public void setLotteryResults(List nos) { ... } }
signatures段允许我们暗示DWR应该用什么类型去处理。格式对以了解JDK5的泛型的人来说很容易理解。
import java.util.List; import com.example.Check; Check.setLotteryResults(List
DWR中又一个解析器专门来做这件事,所以即便你的环境时JDK1.3 DWR也能正常工作。
解析规则基本上会和你预想规则的一样(有两个例外),所以java.lang下面的类型会被默认import。
第一个是DWR1.0中解析器的bug,某些环境下不能返回正确类型。所以你也不用管它了。 第二个是这个解析器时\阳光(sunny day)\解析器。就是说它非常宽松,不想编译器那样严格的保证你一定正确。所以有时它也会允许你丢失import:
import java.util.List; Check.setLotteryResults(List
将来的DWR版本会使用一个更正式的解析器,这个编译器会基于官方Java定义,所以你最好不要使用太多这个不严格的东西。
signatures段只是用来确定泛型参数中的类型参数。DWR会自己使用反射机制或者运行时类型确定类型,或者假设它是一个String类型。所以: 不需要signatures - 没有泛型参数:
public void method(String p); public void method(String[] p); 需要signatures - DWR不能通过反射确定:
public void method(List
public void method(Map
public void method(List
public List
没有必要让Javascript中的所有对象的key都是String类型 - 你可以使用其他类型作为key。但是他们在使用之前会被转换成String类型。DWR1.x用Javascript的特性把key转换成String。DWR2.0可能会用toString()方法,在服务段进行这一转换。
DWR Annotations
从DWR2.0(正在开发)开始,你也可以用Annotations来配置DWR DWR标注是用来代替dwr.xml或者与其一同工作的。 初始配置
要使用DWR的标注,你需要在web.xml中配置不同的DWR控制器。
com.example.RemoteFunctions, com.example.RemoteBean
servlet参数classes定义的时可以标注的类的全名,这些名字用逗号分割。 远程访问类
要使一个简单的class可以成为远程访问类,你需要使用@Create和@RemoteMethod标注。 @Create
public class RemoteFunctions { @RemoteMethod
public int calculateFoo() { return 42; } }
没有被@RemoteMethod标注的方法不能被远程访问。
要在Javascript使用不同于类型的名字,使用@Create标注的 name 属性。 @Create(name=\)