用 Seam Remoting 和 Ajax4jsf 无缝熔接客户机和服务器 |
级别: 中级 Dan Allen ([email protected]), 高级 Java 工程师, CodeRyte, Inc. 2007 年 6 月 25 日 JSF 基于组件的方法论促进了抽象,但大多数 Ajax 实现由于公开了底层的 HTTP 交换而使之大受干扰。在 无缝集成 JSF 系列 最后的这篇文章中,Dan Allen 展示了如何使用 Seam Remoting API 和 Ajax4jsf 组件与服务器上的受管 bean 通信,就好像这些 bean 与浏览器同在本地一样。您将了解利用 Ajax 作为 JSF 事件驱动架构的一种自然改进是多么地容易,以及如何在不影响 JSF 组件模型的前提下实现这一目的。
Java? 开发人员都很看好 mashup,所以您可能会困惑:Seam 与号称 Web 2.0 的技术,尤其是 Ajax,如何能集成。若能使用
Remoting API 和 Ajax4jsf 组件来协助基于 JSF 应用程序中的 Ajax 风格的交互。正如您将会看到的,结合 Seam 我首先会为您展示 Seam 是如何推动 Ajax 编程的基于组件的新方式的。您将学会如何使用 Seam Remoting API
Open 18 和 Google Maps 之间的 mashup 让用户可以定位地图中的高尔夫球场目录中的位置。将此球场目录和球场细节页合并起来(并将低层代码 Ajax 化) 如果您曾经深受涉及到大量 JavaScript 的过于复杂的 正如在应用程序中希望避免显式的内存管理一样,您亦不 JSF 生命周期通过对底层的 servlet
在图 1 所示的用例中,用户能看到单击按钮后所发生的方法调用的结果。在研究此用例时,有两个要点需要注意: (1) 该页永远无法刷新;(2) 客户端代码与组件上的方法进行透明通信,而不是显式地构建然后再请求 URL。标准的 HTTP 请求在后台使用,但客户端代码永远无需直接与 HTTP 协议交互。
Remoting 和 Ajax4jsf 是两个独特的库,可分别服务于 JSF 的 “Ajax 化” 的目的。两个库均使用 Ajax 虽然这两个库工作起来有些差别,但它们并不是相互排斥的。由于它们都采用的是 JSF 组件模型,所以二者可以很容易地相互结合,这将在本文后面的部分详细介绍。目前,我们只需分别考虑二者各自将 Ajax 风格的交互引入 JSF 应用程序的方式:
我将深入探究这些方式,但我们还是先来看看 Ajax 的基础知识吧。
缩小差异 要 实际上,在大多数传统的 Web 应用程序中,客户机和服务器可以正常通信,但交互性就完全是另一回事了。服务器发起对话,浏览器收听对话。您如果以前曾陷于这 类对话之中,实在不足为怪。在没有 Ajax 通信的世界里,浏览器可以发送对任何 URL 的同步请求,但它必须要呈现服务器发回的 HTML。这类交互性的另一个不足之处是等待时间很多。 若 Web 浏览器作为 Ajax 客户机
Remoting 和 Ajax4jsf 对打破客户和浏览器组件的隔阂所采用的方式有所不同,所以很有必要知道如何利用好这二者。Seam Seam Remoting 中的调用机制与 Java RMI 类似,二者都使用本地代理对象或 “存根” 来允许 JavaScript 调用位于远程服务器上的组件。就客户而言,该存根对象就是
一方面,Ajax4jsf 提供了 JSF 组件标记来声明性地关联 UI 事件和服务器端受管 bean
片段的形式返回。这些段与此页中单个的 JSF 组件相关联并证明其自身为部分页更新。因此,此页的隔离区域可以通过新的 标记由浏览器重新呈现。这些段都是特殊请求的,或者通过使用 Ajax4jsf 组件标记的
会让人兴奋不已。实际上(这个消息有点出人意料,所以您最好坐下来听),综合 Seam Remoting 和 Ajax4jsf 当 Seam Remoting 和 Ajax4jsf 在功能上有些重叠时,二者都可以很利于将 Ajax 风格的交互添加到应用程序。此外,您很快就会看到,两个库都为 JSF 应用程序提供了无缝的 Ajax 解决方案。
Seam Remoting 快速入门 如 让我们先来快速看看使用 Seam Remoting 来 “Ajax 化” JSF 应用程序所需的步骤。 公开 bean 将服务器端对象方法对远端 Ajax 公开有两个要求:此方法必须是 Seam 组件的公共成员且必须配备 实际的简单性在清单 1 中可见一斑,其中 Seam 组件 清单 1. 公开远端方法调用
服务于资源 服务器端组件设置好后,需要让浏览器准备好来调用
需要考虑使用这个 servlet 的惟一情况是在应用程序中设置 Seam Remoting 的时候。更好的是您只需配置 Seam 的定制 Resource Servlet 的 XML 定义如清单 2 所示,且必须安装于应用程序的 web.xml 文件中 Faces Servlet 之下: 清单 2. Seam Resource Servlet 的 XML 定义
自引导 API
库。Resource Servlet 将作业指派给
须要将这两个 JavaScript 库都导入页面,如清单 3 所示。第一个库 remote.js 是静态的,将 Seam 的客户端 清单 3. 导入客户端框架和 API
有了这些,您就可以着手了!您已经完成了 Seam Remoting 设置,现在可以开始进行一些远程调用了。
进行远程调用 所有用于 Seam Remoting 库的客户端框架代码都封装在 Seam Remoting 库的功能在 执行细节
这些实例均是由 Seam 动态构建的远端存根。存根代理所有的方法调用,将组件名、方法和参数编排处理成 XML,并通过一个 Ajax 请求将 至此,有关背景的介绍已经足够了。清单 4 显示了该如何执行 conversation 作用域内的 清单 4. 调用远端方法
在清单 4
conversation 作用域内的 bean 对 conversation 作用域内的 bean 需要更多技巧,因为它们基于对话令牌的存在而与
") 可以实现这一目的。 Seam 总是在
Google map 和 Open 18 应用程序
借助 Ajax,可以有多种改进 Open 18 应用程序的方法,在我们继续之前,您可以自己尝试其中的一些方法。第一个可以做的事情是在 Open 18 和 Google Map 之间创建一个 mashup。
借用 Google 的世界视图
JavaScript API 能代您完成很多工作的话,那就另当别论了。 要在地图上放上标记,首先要通过远端方法调用从服务器端组件获取球场集。接下来,用
的来说,地图组件和面向位置数据的集成很有趣,此 mashup 尤其具启迪意义。用户现在可以实际查看地图上每个球场的边界!在 Map
编织进 Google Maps
地址解析为地理空间点的方法存根与 Seam Remoting
与地图集成相关的 API 方法有两个:
Maps API 脚本之外,您还应该识别出 清单 3 中曾经用到的 Seam Remoting 脚本。 清单 5. 映射 Open 18 和 Geocoder
了节省服务器资源,您希望远端调用检索相同的球场列表,这些球场是在页面被 JSF 呈现时加载进 conversation
要找到球场,下一步是使用 在把球场放到地图上的最后一个步骤中,每个球场的地址都被
没有罗盘的地图
在,您的地图已经点缀了所有这些光鲜的标记,但还不可能将球场目录中的行与地图上的标记关联起来。这时就需要罗盘图标发挥作用了。我们将添加多一点 清单 6. 能呈现罗盘图标的组件标记
|