【问题标题】:Icefaces push without using Ajax/JavascriptIcefaces 推送不使用 Ajax/Javascript
【发布时间】:2011-09-09 03:40:48
【问题描述】:
我是 jsf 和 ICEfaces 框架的新手,几周前我们就开始使用它们。
现在我们尝试在不使用 AJAX 的情况下执行推送,以便通过 WebService 使该操作可用。
我找到了this thread,这似乎是我们想做的事情,但我还是有点迷茫。这家伙声称已经成功:
我将我的 Renderable 类连接到我的
网络服务,所以它只需要调用
请求的适当方法
渲染。
谁能给我一个关于如何将 WebService 连接到 Renderable 类的提示?
我怀疑这与PortableRendered 有关,但正如我告诉你的,我还是有点迷茫。
问候。
【问题讨论】:
标签:
web-services
jsf
push
icefaces
【解决方案1】:
下面的例子是最简单的例子。使用 ICEfaces 推送更新每两秒在网络浏览器中更新一次运动成绩。
在为新会话构造托管 bean 之后调用方法 ScoreManagerBean.postConstruct()。此方法启动一个线程,每两秒调用一次 PortableRenderer.render(sessionId),从而将新分数推送到 Web 浏览器。在实际应用中,推送更新会在收到应用中数据已更改的消息/触发器后,在某种回调函数中运行。
完全相同的概念用于更复杂的应用程序,例如新闻收报器和 ebay 风格的拍卖网站。
这里是托管 bean 类 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>