Следующий пример - самый простой случай.Спортивный счет обновляется в веб-браузере каждые две секунды с помощью 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>