java - 服务器发起的渲染 : EJB -> FacesContext?

标签 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、JSF2 + Icefaces 2.0 alpha2)

最佳答案

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

从技术上讲,让 EJB 向 JSF 通知新消息的唯一方法是让 EJB 在与 FacesServlet 的 url 模式匹配的 URL 上发起 HTTP 请求,并将消息作为请求参数。您可以使用 java.net.URLConnection 来实现此目的。然后,JSF 可以执行 Comet/HTTP 推送之类的操作,以按照您提到的 IceFaces 方式使用消息更新 View 。

例如

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,如下所示:

@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 注释,但它们应该足够不言自明。

关于java - 服务器发起的渲染 : EJB -> FacesContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2673716/

相关文章:

java - 使用 java 从 .cgi 中提取 .jpg(IP 网络摄像头)

java - JSF h :selectOneMenu trouble: java. lang.IllegalArgumentException 无法将类 java.lang.String 的 "string"转换为接口(interface) java.util.List

Java EE EJB 3.0 玻璃鱼

java - 如何使用@PostConstruct 在无状态 bean EJB3 中创建计时器?

java - 从 struts 中定义的 Action 类访问 EJB 方法

java - RandomAccessFile setLength(0) 将空字符字符串添加到文件中

java - 我应该在哪里设置逻辑以正确更新我的小部件?

java - AWS Java - 如何加载 ~/.aws/config 文件?

jsf - 如何为<p:pickList>编写自定义转换器

循环内的 ADF Faces 1.1 JavaScript