【问题标题】:JSF: Using AJAX push with ICEfaces (ICEpush)JSF:使用带有 ICEfaces 的 AJAX 推送 (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?会不会是这个原因?

标签: ajax jsf icefaces icepush


【解决方案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 吗?如果有,有哪些版本?无论如何,谢谢你清理它,泰德!
      猜你喜欢
      • 2011-09-09
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2013-09-13
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多