Java 服务器启动的呈现:EJB->;FacesContext?

Java 服务器启动的呈现:EJB->;FacesContext?,java,jsf,ejb-3.0,icefaces,jsf-2,Java,Jsf,Ejb 3.0,Icefaces,Jsf 2,我已经在Icefaces论坛上问过这个问题,但同时我意识到这是一个更普遍的问题 当我在MDB中收到消息时,我想更新JSF页面的部分内容 问题是,如何从EJB容器中获取FacesContext 在消息处理函数中,FacesContext.getCurrentInstance()返回null 我还尝试将JSF托管bean变成MDB,但我做不到(似乎不能将两者都放在同一个类中?) 由于我是JSF领域的初学者,我现在有点困了。有没有办法让它发挥作用 (Glassfish v3+Netbeans 6.8,

我已经在Icefaces论坛上问过这个问题,但同时我意识到这是一个更普遍的问题

当我在MDB中收到消息时,我想更新JSF页面的部分内容

问题是,如何从EJB容器中获取FacesContext

在消息处理函数中,FacesContext.getCurrentInstance()返回null

我还尝试将JSF托管bean变成MDB,但我做不到(似乎不能将两者都放在同一个类中?)

由于我是JSF领域的初学者,我现在有点困了。有没有办法让它发挥作用


(Glassfish v3+Netbeans 6.8,JSF2+Icefaces 2.0 alpha2)

我不是专家,但我希望FacesContext仅在处理JSF请求期间可用。恐怕你不能完全做你想做的事,但你肯定可以解决这个问题。实际上有两个问题:

  • 如何通过MDB获得JSF页面的更新
  • 如何在事件发生时刷新客户端上的页面?你 无法正常地将数据从服务器发送到客户端,客户端必须 重新要求他们(尽管有一些解决方法,例如 ))
  • 我想要以下的东西:

  • 在MDB中,将更新后的数据存储到某个地方,比如全局缓存(带有@Singleton的无状态会话bean和更新的集合或映射)
  • 修改JSF页面,使其定期向服务器查询更新(最好在后台通过一些支持Ajax的JSF组件使用Ajax)——如果通过MDB接收到更新,服务器将返回更新,页面将重新呈现自身

  • 我有一个变通方法,它涉及JSF端的计时器(幸运的是它只在服务器上,不需要AJAX和客户机-服务器通信),它检查单例并在必要时触发更新。
    但是,我仍然认为这不是一个合适的解决方案,而且它可以在没有计时器的情况下完成…

    FacesContext是基于HTTP请求的,因此仅在HTTP请求处理期间可用,甚至只有在请求URL与FacesServlet的URL模式匹配时才可用。如果您不在由服务器执行以处理HTTP请求的线程内,那么也没有FacesContext。在EJB容器中,完全没有HTTP请求的方法

    从技术上讲,让EJB向JSF通知新消息的唯一方法是让EJB在与FacesServlet的URL模式匹配的URL上触发HTTP请求,并将消息作为请求参数。您可以为此使用
    java.net.URLConnection
    。JSF接着可以执行Comet/HTTPPush之类的操作,以您提到的方式用消息IceFaces更新视图

    例如

    还有一个
    poll.jsf
    ,它连接到一个支持bean,如下所示:

    @ManagedBean
    public class Poll {
    
        @ManagedProperty(value="#{param.msg}")
        private String msg;
    
        @PostConstruct
        public void init() {
            // Do something with msg.
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
    }
    

    注意:使用JSF2.0注释,但它们应该足够自我解释。

    我在Icefaces论坛上也得到了回复:

    org.icefaces.application.PortableRenderer提供了一个可以在非JSF线程上调用推送的对象。
    (这在svn中继中提供,并将在下一个alpha(=Icefaces 2.0 alpha 3)版本中提供。)

    您好,谢谢您的回答#2很容易,因为IceFaces2.0有它的PushRenderer类,它工作得很好#问题1:如果我不在FacesServlet管理的类实例中,我如何引用它?EJB在不同的容器中运行…@egbokul#1根本不处理JSF,它只是将数据存储在@Singleton会话bean中,然后JSF就可以访问该会话bean。所以它是JSF->EJB,而不是JSF->EJB。但是使用您提到的PortableRenderer,您有望将数据从MDB直接推送到JSF。我很好奇它是如何工作的:-)祝你好运!谢谢你的回答。它可以工作,尽管在我看来它仍然不是最干净的解决方案(为什么EE应用程序服务器没有一种内部的方式来完成这项工作,而不从外部调用servlet?),但可以接受。
    @ManagedBean
    public class Poll {
    
        @ManagedProperty(value="#{param.msg}")
        private String msg;
    
        @PostConstruct
        public void init() {
            // Do something with msg.
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
    }