我可以从热切的ApplicationScoped托管bean中查找Web应用程序上下文URL吗?

时间:2014-06-06 01:23:55

标签: jsf

我想获取一个Web应用程序上下文URL(例如:http://myserver:8080/myApp)并在启动时将其存储在数据库中。

我知道如何使用以下内容挂钩启动方法调用:@ApplicationScoped结合@ManagedBean(eager=true)@PostConstruct

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()会给我上下文路径。

但是,由于使用@PostConstruct注释的方法未被请求触发(因为它非常渴望),getRequestContextPath()正在给我null

1 个答案:

答案 0 :(得分:0)

正如您的问题所述,急切的@ApplicationScoped bean无法访问@PostConstruct中的上下文,因为没有请求 - 响应周期。相反,在部署/取消部署应用程序时,使用ServletContextListener进行侦听。

public class MyAppListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //here the application has been deployed
        ServletContext servletContext = sce.getServletContext();
        String contextPath = servletContext.getContextPath();
        //do what you want/need with context path
        //...
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //here the application is being undeployed
    }
}

然后只需在web.xml中正确配置监听器

<listener>
    <listener-class>the.package.of.your.MyAppListener</listener-class>
</listener>