JSF: использование AJAX push с ICEfaces (ICEpush)
Я использую ICEfaces с ICEpush для отправки некоторых данных в браузер.
Тем не менее, он работает не так, как запланировано: он не работает с AJAX, он просто вызывает действие и возвращается из действия, как любое другое действие без AJAX.
Я использую новейшие версии ICEfaces и ICEpush, а также Tomahawk 7 и JSF 2.
Он не работает ни с сервлетом 2.5, ни с сервлетом 3.0.
Это важные части моего компонента (см. Область видимости):
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>
Я что-то пропустил? Спасибо!
5 ответов
ICEfaces 2.0 еще не интегрирован с MyFaces. Вы пробовали ваше приложение с включенными файлами Mojarra .jar?
Я знаком только с 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>
У вас есть инструмент разработки, который может проверить код? По крайней мере, на Vaadin версии ICEPush вы не могли доверять их примерам. На их официальной демонстрации был объявлен устаревший код, а в чате они дали код, в котором были импортированы данные с другой планеты с правильными.
Мой Eclipse сказал, что многие операции импорта были неправильными, и код на некоторых функциях устарел. Эти ребята там развиваются так быстро, что их документы устарели. Итак, внимательно прочитайте, что говорит ваш инструмент о коде!
Вы отображали push-сервлет в своем файле web.xml? Может ли это быть причиной?
У меня также есть проблема с интеграцией IceFaces (чтобы использовать push) с приложением, которое уже использует Richfaces. Но IcePush можно интегрировать напрямую практически с любым java-веб-приложением (с Servlet Api). Вы можете увидеть более подробную информацию на http://achorniy.wordpress.com/2012/02/29/icepush-integration-to-web-application/
Идея состоит в том, чтобы использовать javascript-api (или jQuery-api), предоставляемый IcePush. Итак, ваша страница с javascript-api регистрируется в качестве прослушивателя для push-уведомлений, и в обратном вызове вы можете вызывать любые функции javascript для обновления вашей страницы. В примере Richfaces вы можете использовать ajaxUpdateFunction(), которая на самом деле поддерживается <a4j:jsFunction name="ajaxUpdateFunction" action="#{myBean.update} reRender="updatedComponent(s)" ajaxSingle="true"/>
или выполнить ajax-запрос с помощью jQuery. В вашем случае (JSF-2.0) я думаю, что вы можете позвонить jsf.ajax.request(this, event, {render:'ajaxTestTable'})
обновить то, что вы хотите (примеры http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/)
все что вам нужно сделать на стороне сервера - это зарегистрировать сервлет IcePush и инициализировать соединение icePush на стороне клиента с помощью javascript api.