5

我刚开始学习JSF。

在使用示例时,我觉得需要访问 MyBean 类中的 ServletContext 对象。我想使用我使用 Listener 放入 ServletContext 中的对象。我可以这样做吗?ServletContext 在 Beans 中是否也有其范围?

4

1 回答 1

14

它只是可用的ExternalContext#getContext()。另请参阅它的 javadoc

获取上下文

public abstract java.lang.Object getContext()

返回当前应用程序的应用程序环境对象实例。

在应用程序启动或关闭期间调用该方法有效。如果在应用程序启动或关闭期间调用,这将返回与在实际请求期间调用返回的容器上下文实例(或)相同的容器上下文实例(或)ServletContextPortletContextgetContext()ExternalContextFacesContext

Servlet:这必须是当前应用程序的javax.servlet.ServletContext实例。

所以,这应该这样做:

public void someMethod() {
    ServletContext servletContext = (ServletContext) FacesContext
        .getCurrentInstance().getExternalContext().getContext();
    // ...
}

与具体问题无关,根据具体的功能要求,这可能不是具体问题的正确解决方案。普遍的共识是您的 JSF 代码应该尽可能地没有任何javax.servlet.*依赖项/导入。您的问题并不完全清楚,但如果您确实打算访问您放在 servlet 上下文中的属性,那么只需从中获取它ExternalContext#getApplicationMap()

例如在ServletContextListener

event.getServletContext().setAttribute("foo", foo);

然后在 JSF

Foo foo = (Foo) FacesContext.getCurrentInstance().getExternalContext()
    .getApplicationMap().get("foo");

甚至只是通过@ManagedProperty

@ManagedProperty("#{foo}")
private Foo foo; // +setter
于 2013-01-09T20:24:40.600 回答