我是jsf和ICEfaces框架的新手,几周前我们就开始玩它们了。
现在,我们正在尝试在不使用AJAX的情况下执行推送,以便通过WebService实现此操作。
我找到了这个线索,这似乎是我们想要做的事情,但我还是有点迷路了。这家伙声称已经成功了:
我将Renderable类连接到web服务,所以它只需要调用请求提供
有人能告诉我如何将WebService"连接"到Renderable类吗?我怀疑PortableRendered有什么关系,但正如我告诉你的,我仍然有点迷失。
谨致问候。
以下示例是最简单的情况。使用ICEfaces推送更新,网络浏览器每两秒钟更新一次体育成绩。
ScoreManagerBean.postConstruct()方法是在为新会话构造托管bean之后调用的。此方法每隔两秒钟启动一个调用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>