JSF:使用带有 ICEfaces 的 AJAX 推送 (ICEpush)

Posted

技术标签:

【中文标题】JSF:使用带有 ICEfaces 的 AJAX 推送 (ICEpush)【英文标题】:JSF: Using AJAX push with ICEfaces (ICEpush) 【发布时间】:2011-08-31 01:47:02 【问题描述】:

我正在使用 ICEfaces 和 ICEpush 将一些数据推送到浏览器。

但是,它并没有按计划工作:它不执行 AJAX,它只是调用操作并从操作返回,就像任何其他非 AJAX 操作一样。

我正在使用最新的 ICEfaces 和 ICEpush 版本以及 Tomahawk 7 和 JSF 2。

它既不适用于 Servlet 2.5 也不适用于 Servlet 3.0。

这些是我的 bean 的重要部分(视图范围):

public AjaxTest() 
    PushRenderer.addCurrentSession(PUSH_GROUP);


    public void addText() throws InterruptedException 
    for(int i = 0; i < 5; i++) 
        lines.add("line " + i);
        PushRenderer.render(PUSH_GROUP);
        Thread.sleep(1000);                     
    

这是我形式的 sn-p:

    <h:panelGroup>
        <h:dataTable id="ajaxTestTable" value="#ajaxTest.lines" var="line">
            <h:column>
                <h:outputText value="#line" />
            </h:column>
        </h:dataTable>
        <h:commandButton id="startAjax" value="Start"
            action="#ajaxTest.addText" />
    </h:panelGroup>

我错过了什么吗?谢谢!

【问题讨论】:

你的配置怎么样?您使用的是哪些不同的?是否存在所有必要的框架配置?你这里似乎有很多不同的。 感谢您抽出宝贵时间!它不适用于 ICEfaces 的 detault 配置值。你指的其他配置是什么?我没有配置任何特殊的东西。也许这是 MyFaces 的问题?我的想法不多了。 :( 您是否在 web.xml 中映射了推送 servlet?会不会是这个原因? 【参考方案1】:

IceFaces(使用推送)与已经使用 Richfaces 的应用程序集成时也遇到了问题。但是可以将 IcePush 直接与几乎任何 java-web-application(使用 Servlet Api)集成。 更多详情请到http://achorniy.wordpress.com/2012/02/29/icepush-integration-to-web-application/

这个想法是使用 IcePush 提供的 javascript-api(或 jQuery-api)。因此,您的带有 javascript-api 的页面将自己注册为推送通知的侦听器,并且在回调中您可以调用任何 javascript 函数来更新您的页面。在 Richfaces 示例中,您可以使用实际上由 &lt;a4j:jsFunction name="ajaxUpdateFunction" action="#myBean.update reRender="updatedComponent(s)" ajaxSingle="true"/&gt; 支持的 ajaxUpdateFunction() 或使用 jQuery 执行 ajax-request。在您的情况下(JSF-2.0)我认为您可以致电jsf.ajax.request(this, event, render:'ajaxTestTable') 来更新您想要的内容(示例http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/)

您在服务器端需要做的就是注册 IcePush servlet 并使用 javascript api 在客户端初始化icePush 连接。

【讨论】:

【参考方案2】:

我只熟悉 Icefaces 1.8,但在我看来你的命令按钮没有启用 ajax。您还必须使用 actionListener 而不是 action

您可以使用 icefaces 命令按钮:

<ice:commandButton id="startAjax" value="Start" 
       actionListener="#ajaxTest.addText"/>

或 JSF 2 ajax 标签:

<h:commandButton id="startAjax" value="Start">
    <f:ajax listener="#ajaxTest.addText"/>
</h:commandButton>

【讨论】:

【参考方案3】:

您有一些可以验证代码的开发工具吗?至少在 ICEPush 的 Vaadin 版本上,你不能相信他们的例子。在他们的官方演示中,有已弃用的代码,在他们的聊天中,他们提供了从另一个星球导入的代码,其中包含正确的代码。

我的 Eclipse 告诉我许多导入是错误的,并且代码在某些函数上已弃用标记。那里的这些人发展得如此之快,以至于他们的文件永远过时了。因此,请仔细阅读您的工具对代码的说明!

【讨论】:

Ted 刚刚在你上面的帖子中清除了它。它不适用于 MyFaces。 :( 感谢您抽出宝贵时间!【参考方案4】:

ICEfaces 2.0 尚未与 MyFaces 集成。您是否使用包含的 Mojarra .jar 文件尝试过您的应用程序?

【讨论】:

啊!真可惜!我现在能做什么?切换到 Mojarra 并不是最好的选择,因为我正在扩展一个使用 MyFaces 的更大的应用程序,而我不能只是切换。我可以使用旧版本的 ICEfaces 来使用 ICEpush 和 MyFaces 吗?如果有,有哪些版本?无论如何,谢谢你清理它,泰德!

以上是关于JSF:使用带有 ICEfaces 的 AJAX 推送 (ICEpush)的主要内容,如果未能解决你的问题,请参考以下文章

jsf/icefaces 中的 javascript

Primefaces,icefaces,myfaces跟JSF哪个功能强大,各自的优缺点

JBoss RichFaces vs IceFaces vs Apache Trinidad - JSF 组件库比较

在一个浏览器中使用带有多个选项卡的 JSF [重复]

为 JSF/ICEfaces 设置浮点格式化语言环境?

JSF、RichFaces、PrimeFaces 和 IceFaces 之间的区别