扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
从实质上看,DWR 在客户端和服务器端代码间形成了紧密的耦合,这有许多含义:首先,远程方法 API 的变化需要在 DWR 存根调用的 JavaScript 上反映出来。第二(也是最明显的),这种耦合会造成对客户端的考虑会渗入服务器端代码。例如,因为不是所有 Java 类型都能转化成 JavaScript,所以有时有必要给 Java 对象添加额外方法,好让它能够更容易地远程化。在示例场景中,我通过把 getSimpleContents() 方法添加到 Cart 来解决这个问题。我还添加了 getCart() 方法,它在 DWR 场景中是有用的,但在其他场景中则完全是多余的。由于远程对象粗粒度 API 的需要以及把某些 Java 类型转化成 JavaScript 的问题,所以可以看到远程 JavaBean 会被那些只对 Ajax 客户有用的方法“污染”。
为了克服这个问题,可以使用包装器类把额外的特定于 DWR 的方法添加到普通 JavaBean。这意味着 JavaBean 类的 Java 客户可能看不到与远程相关联的额外的毛病,而且也允许给远程方法提供更友好的名称 —— 例如用 getPrice() 代替 getFormattedPrice()。图 4 显示的 RemoteCart 类对 Cart 进行了包装,添加了额外的 DWR 功能:
图 4. RemoteCart 为远程功能对 Cart 做了包装
最后,需要记住:DWR Ajax 调用是异步的,所以不要期望它们会按照分派的顺序返回。在示例代码中我忽略了这个小问题,但是在这个系列的第一篇文章中,我演示了如何为响应加时间戳,以此作为保证数据到达顺序的一种简单手段。
结束语
正如所看到的,DWR 提供了许多东西 —— 它允许迅速而简单地创建到服务器端域对象的 Ajax 接口,而不需要编写任何 servlet 代码、对象序列化代码或客户端 XMLHttpRequest 代码。使用 DWR 部署到 Web 应用程序极为简单,而且 DWR 的安全性特性可以与 J2EE 基于角色的验证系统集成。但是 DWR 并不是对于任何一种应用程序架构都适合,所以在设计域对象的 API 时需要做些考虑。
如果想学习用 DWR 进行 Ajax 的利弊的更多内容,最好的方式就是下载并开始实践。DWR 有许多我没有介绍的特性, 文章源代码 是把 DWR 投入使用的一个良好起点。请参阅 参考资料,学习关于 Ajax、DWR 和相关技术的更多内容
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者