Icefaces толкают без использования Ajax / Javascript - PullRequest
0 голосов
/ 06 июня 2011

Я абсолютный новичок с фреймворками jsf и ICEfaces, и мы начали играть с ними пару недель назад.

Теперь мы пытаемся выполнить push без использования AJAX, чтобы сделать эту операцию доступной через WebService.

Я нашел эту ветку , которая, кажется, нам нравится, но я все еще немного растерялся. Парень утверждает, что преуспел:

Я записал свой класс Renderable в свой веб-сервис, поэтому он просто должен позвонить соответствующий метод для запроса визуализации.

Может ли кто-нибудь дать мне подсказку о том, как "подключить" WebService к классу Renderable? Я подозреваю, что есть что-то, связанное с PortableRendered , но, как я уже говорил, я все еще немного растерян.

Привет.

1 Ответ

0 голосов
/ 09 августа 2011

Следующий пример - самый простой случай.Спортивный счет обновляется в веб-браузере каждые две секунды с помощью push-обновления ICEfaces.

Метод ScoreManagerBean.postConstruct () вызывается после создания управляемого компонента для нового сеанса.Этот метод запускает поток, который вызывает PortableRenderer.render (sessionId) каждые две секунды, в результате чего новый счет передается в веб-браузер.В реальном приложении push-обновление будет запускаться в некоторой функции обратного вызова после получения сообщения / триггера об изменении данных в приложении.

Точно такая же концепция используется для более сложных приложений, таких как новости-тикеры и аукционные сайты в стиле ebay.

Вот класс управляемых бинов ScoreManagerBean.java:

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import java.util.Random;

import org.icefaces.application.PortableRenderer;
import org.icefaces.application.PushRenderer;

@ManagedBean(name = "scoreManager")
@SessionScoped
public class ScoreManagerBean
{
    private int m_nPointsA = 0;
    private int m_nPointsB = 0;
    private PortableRenderer m_renderer;
    private String m_sessionId;

    @PostConstruct
    public void postConstruct()
    {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            HttpSession session;
            session = (HttpSession)facesContext.getExternalContext().getSession(false);
            m_sessionId = session.getId();
            PushRenderer.addCurrentSession(m_sessionId);
            m_renderer = PushRenderer.getPortableRenderer(facesContext);
            new BidThread().start();
    }

    public String getCurrentScore()
    {
            return m_nPointsA + "-" + m_nPointsB;
    }

    private class BidThread extends Thread
    {
            public void run()
            {
                    Random r = new Random();
                    for (int i = 0; i < 1000; i++)
                    {
                            try
                            {
                                    sleep(2000);
                                    System.out.println("Score has changed");
                                    if (r.nextInt() % 2 == 0)
                                            m_nPointsA++;
                                    else
                                            m_nPointsB++;
                                    m_renderer.render(m_sessionId);
                            }
                            catch (Exception e)
                            {
                                    e.printStackTrace();
                            }
                    }
            }
    }
}

и веб-страница pushexample.xhtml, отображающая текущий счет:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:icecore="http://www.icefaces.org/icefaces/core"
  xmlns:ice="http://www.icesoft.com/icefaces/component"
  xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
</h:head>                                   

<h:body>
<ice:outputText value="Current score: #{scoreManager.currentScore}"/>
</h:body>
</html>        
...