我刚开始学习JSF。
在使用示例时,我觉得需要访问MyBean类中的ServletContext对象。我想使用一个使用Listener放在ServletContext中的对象。我能这样做吗? ServletContext的范围是否也在Beans中?
答案 0 :(得分:13)
它只能由ExternalContext#getContext()
提供。另请参阅its javadoc:
的getContext
public abstract java.lang.Object getContext()
返回当前应用程序的应用程序环境对象实例。
在应用程序启动或关闭期间调用此方法是有效的。如果在应用程序启动或关闭期间调用,则返回与
ServletContext
上PortletContext
调用getContext()
时返回的相同的容器上下文实例(ExternalContext
或FacesContext
)。 {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