FacesContext 是基于 HTTP 请求的,因此仅在 HTTP 请求处理期间可用,甚至只有在请求 URL 与 FacesServlet 的 url 模式匹配时才可用。如果您不在服务器执行的处理 HTTP 请求的线程内,那么也没有 FacesContext 的方法。在 EJB 容器中,完全没有 HTTP 请求的方式。
从技术上讲,让 EJB 将新消息通知 JSF 的唯一方法是让 EJB 在与 FacesServlet 的 url 模式匹配的 URL 上触发 HTTP 请求,并将消息作为请求参数。你可以用java.net.URLConnection
这个。然后,JSF 可以执行 Comet/HTTP 推送之类的操作,以使用您提到的 IceFaces 方式的消息更新视图。
例如
URL url = new URL("http://example.com/context/poll.jsf?msg=" + URLEncoder(msg, "UTF-8"));
URLConenction connection = url.openConnection();
InputStream response = connection.getInputStream();
和一个poll.jsf
像这样附加到支持bean的a:
@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;
}
}
注意:使用 JSF 2.0 注释,但它们应该足够自我解释。