JSF: использование AJAX push с ICEfaces (ICEpush) - PullRequest
3 голосов
/ 23 мая 2011

Я использую 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>

Я что-то пропустил?Спасибо!

Ответы [ 4 ]

2 голосов
/ 24 мая 2011

ICEfaces 2.0 еще не интегрирован с MyFaces.Вы пробовали ваше приложение с включенными файлами Mojarra .jar?

1 голос
/ 19 июля 2011

Я знаком только с 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>
0 голосов
/ 02 марта 2012

У меня также есть проблема с интеграцией 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.

0 голосов
/ 24 мая 2011

Есть ли у вас инструмент разработки, который может проверить код?По крайней мере, на Vaadin версии ICEPush вы не могли доверять их примерам.На официальном демоверсии был объявлен устаревший код, а в чате они дали код, в котором были импортированы данные с другой планеты с правильными.

Мой Eclipse сообщил, что многие операции импорта были неправильными, и код на некоторых функциях был устаревшим.Эти ребята там развиваются так быстро, что их документы устарели.Итак, внимательно прочитайте, что говорит ваш инструмент о коде!

...