【问题标题】: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>        
    

    【讨论】:

    • 这不是我们想要做的,但它确实有效,谢谢。
    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2011-10-28
    • 2011-02-05
    • 2012-06-30
    相关资源
    最近更新 更多