如果你的代码调用FacesContext,它不会与JSF请求生命周期相关的线程之外工作。为每个请求创建一个FacesContext对象,并将其放置在请求的末尾。您可以通过static call获取它的原因是因为它在请求开始时设置为ThreadLocal。 FacesContext的生命周期与ServletContext的生命周期没有关系。
也许这还不够(听起来你已经走下了这条路),但是你应该可以使用ServletContextListener来做你想做的事。只要确保任何对FacesContext的调用都保存在JSP的请求线程中。
的web.xml:
<listener>
<listener-class>appobj.MyApplicationContextListener</listener-class>
</listener>
实现:
public class MyApplicationContextListener implements ServletContextListener {
private static final String FOO = "foo";
public void contextInitialized(ServletContextEvent event) {
MyObject myObject = new MyObject();
event.getServletContext().setAttribute(FOO, myObject);
}
public void contextDestroyed(ServletContextEvent event) {
MyObject myObject = (MyObject) event.getServletContext().getAttribute(
FOO);
try {
event.getServletContext().removeAttribute(FOO);
} finally {
myObject.dispose();
}
}
}
您可以通过JSF应用范围(如果没有其他变量具有相同名称的存在,或直接)解决这个对象:
<f:view>
<h:outputText value="#{applicationScope.foo.value}" />
<h:outputText value="#{foo.value}" />
</f:view>
如果您希望检索JSF托管bean中的对象,您可以从ExternalContext:
FacesContext.getCurrentInstance()
.getExternalContext().getApplicationMap().get("foo");
这最终解决了 - 我错过了“setAttribute”位,使它可以在JSF代码中访问。谢谢! – 2008-12-01 16:44:11