gpt4 book ai didi

java - 服务器启动的渲染 : EJB -> FacesContext?

转载 作者:行者123 更新时间:2023-12-04 06:54:53 25 4
gpt4 key购买 nike

我已经在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com