web服务-不使用Ajax/Javascript的Icefaces推送



我是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>        

相关内容

  • 没有找到相关文章

最新更新