Java 服务器启动的呈现:EJB->;FacesContext?
我已经在Icefaces论坛上问过这个问题,但同时我意识到这是一个更普遍的问题 当我在MDB中收到消息时,我想更新JSF页面的部分内容 问题是,如何从EJB容器中获取FacesContext 在消息处理函数中,FacesContext.getCurrentInstance()返回null 我还尝试将JSF托管bean变成MDB,但我做不到(似乎不能将两者都放在同一个类中?) 由于我是JSF领域的初学者,我现在有点困了。有没有办法让它发挥作用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,
(Glassfish v3+Netbeans 6.8,JSF2+Icefaces 2.0 alpha2)我不是专家,但我希望FacesContext仅在处理JSF请求期间可用。恐怕你不能完全做你想做的事,但你肯定可以解决这个问题。实际上有两个问题:
我有一个变通方法,它涉及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;
}
}