Seam 和 Flex

发布者    |       Seam

如果论坛有任何指示,Seam 社区对在 Seam 应用程序中添加 Flex 接口有很大的兴趣。Seam 社区的成员已经站出来,整理了一些 Seam 和 Flex 一起工作的有趣示例,这对我们更有雄心的用户来说已经足够好了。但现在,我们需要使这种集成更加正式。因此,我们在 Seam 中增加了第一轮 Flex 支持。

我们从为使用 BlazeDS 的 Seam 应用程序提供 Flex 远程解决方案开始。开始使用 Seam 需要添加jboss-seam-flex.jar到您的应用程序中,以及 BlazeDS 库。BlazeDSMessageBroker,它响应 Flex 客户端的请求,由 Seam Flex 过滤器实例化和管理

<flex:flex-filter url-pattern="/messagebroker/*" />

有了这个,您的 Flex 应用程序就可以与您的 Seam 应用程序通信。显然,自动公开所有 Seam 组件进行远程访问是不明智的。可以通过单个注解启用单个组件的 Flex 远程访问

@Name("org.jboss.seam.example.flex.foo")
@FlexRemote(name="foo")
public class Foo
{
   public void ping() {
      System.out.println("ping!");
   }
}

此注解会导致 Seam 在默认通道上添加一个命名的远程目的地,该目的地可以立即在 Flex 应用程序中作为\<mx:RemoteObject>访问。客户端的最小 mxml 如下

<mx:RemoteObject id="remoteFoo" destination="foo" />

这声明了一个远程对象。目标名称应与 @FlexRemote 注解上的目标名称匹配。

<mx:Button id="button" label="Click Me!" click="remoteFoo.ping()" />

这创建了一个按钮,当按下时调用远程方法。处理结果和错误需要比这更多的代码,但它与其他 Flex 远程对象的工作方式相同。

Flex 远程的一个优点是传递复杂数据结构非常简单。例如,假设您正在编写一个 Flex 客户端,以与 Seam 预订应用程序中的酒店数据一起工作。如果您的 Seam 组件具有以下内容

    
public List<Hotel> queryAllHotels() {
   return entityManager.createQuery("select h from Hotel h").getResultList();
}

则可以轻松地将整个数据集加载到表中。

<mx:RemoteObject id="remoteFoo" destination="foo" fault="fault(event)">
    <mx:method name="queryHotels"
               result="hotelTable.dataProvider=ResultEvent(event).result" />
</mx:RemoteObject>

<mx:DataGrid id="hotelTable" />
<mx:Button label="Query Hotels" click="remoteFoo.queryHotels()" />

注意,这里的远程访问足够智能,可以根据返回的 Java 对象自动确定要显示的列名和值,无需额外编码。它可能不是生产就绪的,但它是一个很好的演示。

因此,如果您想同时使用Flex和Seam,应该如何尝试呢?Flex模块正在Seam2的2分支上开发中。目前,我们只支持这里展示的基本远程调用功能,不支持会话或业务流程范围内的组件,因为将会话正确映射到富客户端并不完全明显。如果您能接受这一点,或者如果您想帮助贡献Flex模块的未来开发,请加入论坛并提供一些反馈。


返回顶部