我使用ICEfaces和ICEpush将一些数据推送到浏览器。
然而,它并没有按计划工作:它没有AJAX,它只是像其他任何非AJAX操作一样调用该操作并从该操作返回。
我使用的是最新的ICEfaces和ICEpush版本以及战斧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);
}
}
这是我表格的一个片段:
<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 2.0尚未与MyFaces集成。您是否使用包含的Mojarra.jar文件尝试过您的应用程序?
我只熟悉Icefaces 1.8,但在我看来,您的命令按钮没有启用ajax。同样,您必须使用actionListener而不是操作
您可以使用以下任一命令按钮:
<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>
您有一些可以验证代码的开发工具吗?至少在Vaadin版本的ICEPush上,你不能相信他们的例子。在他们的官方演示中,有一些不推荐使用的代码,在他们的聊天中,他们给出了从另一个星球进口的正确代码。
我的Eclipse告诉我,许多导入都是错误的,代码在一些函数上有不赞成使用的标记。那里的这些家伙发展得如此之快,以至于他们的文件永远过时了。所以,请仔细阅读您的工具对代码的描述!
我还遇到了将IceFaces(使用推送)与已经使用Richfaces的应用程序集成的问题。但是,可以将IcePush直接与几乎任何java web应用程序集成(使用Servlet Api)。您可以在上查看更多详细信息http://achorniy.wordpress.com/2012/02/29/icepush-integration-to-web-application/
这个想法是使用IcePush提供的JavaScriptAPI(或jQueryAPI)。因此,您的带有javascript api的页面将自己注册为推送通知的侦听器,在回调中,您可以调用任何javascript函数来更新页面。在Richfaces示例中,您可以使用实际由<a4j:jsFunction name="ajaxUpdateFunction" action="#{myBean.update} reRender="updatedComponent(s)" ajaxSingle="true"/>
支持的ajaxUpdateFunction(),或者使用jQuery执行ajax请求。在您的情况下(JSF-2.0),我认为您可以调用jsf.ajax.request(this, event, {render:'ajaxTestTable'})
来更新您想要的内容(示例http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/)
在服务器端,您所需要做的就是注册IcePush servlet,并在客户端使用JavaScriptapi初始化IcePsh连接。