如果你的代碼調用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