Servlets Java在ManagedBean类中面向ServletContext对象

Servlets Java在ManagedBean类中面向ServletContext对象,servlets,jsf-2,Servlets,Jsf 2,我刚开始学习JSF 在处理一个示例时,我觉得需要访问MyBean类中的ServletContext对象。我想使用一个对象,这个对象是我使用Listener放在ServletContext中的。我可以这样做吗?ServletContext在bean中也有它的作用域吗?它只由用户提供。另见: getContext public abstract java.lang.Object getContext() 返回当前应用程序的应用程序环境对象实例 在应用程序启动或关闭期间调用此方法是有效的。如果在应用程

我刚开始学习JSF

在处理一个示例时,我觉得需要访问MyBean类中的ServletContext对象。我想使用一个对象,这个对象是我使用Listener放在ServletContext中的。我可以这样做吗?ServletContext在bean中也有它的作用域吗?

它只由用户提供。另见:

getContext
public abstract java.lang.Object getContext()

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

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

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

因此,这应该做到:

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

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

例如,在
ServletContextListener
中:

event.getServletContext().setAttribute("foo", foo);
然后在JSF中

Foo foo = (Foo) FacesContext.getCurrentInstance().getExternalContext()
    .getApplicationMap().get("foo");
甚至仅仅通过
@ManagedProperty

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

具体的问题是,我正在实例化一个数据库连接,并将该连接对象存储在Context param中,以便所有servlet都可以使用它。看到您的答案,我想ExternalContext类将在JSF中完成这项工作。我看完文件后再查。谢谢:)不客气。老实说,这是一种“eeek”。这样,您的应用程序将在运行约8小时后死亡,具体取决于数据库服务器端连接超时设置。您应该在尽可能短的范围内打开和关闭数据库资源。除其他外,见。然而,对于JavaEEWeb应用程序,我会在一个无状态的EJB中使用JPA
@EntityManager
。这可以通过
@EJB
在JSF管理的bean和servlet中注入。