Java Faces ManagedBean类中的ServletContext对象

时间:2013-01-09 20:14:40

标签: servlets jsf-2

我刚开始学习JSF。

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

1 个答案:

答案 0 :(得分:13)

它只能由ExternalContext#getContext()提供。另请参阅its javadoc

  

的getContext

     

public abstract java.lang.Object getContext()

     

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

     

在应用程序启动或关闭期间调用此方法是有效的。如果在应用程序启动或关闭期间调用,则返回与ServletContextPortletContext调用getContext()时返回的相同的容器上下文实例(ExternalContextFacesContext)。 {1}}在实际请求期间。

     

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

所以,这应该做:

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

不相关具体问题,根据具体的功能要求,这可能不是解决具体问题的正确方法。一般的共识是,您的JSF代码应尽可能 free 任何javax.servlet.*依赖项/导入。您的问题并不完全清楚,但如果您确实想要访问已放入servlet上下文的属性,那么只需从ExternalContext#getApplicationMap()获取它。

E.g。在ServletContextListener

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

然后在JSF中

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

或甚至只是@ManagedProperty

@ManagedProperty("#{foo}")
private Foo foo; // +setter