我想获取一个Web应用程序上下文URL(例如:http://myserver:8080/myApp
)并在启动时将其存储在数据库中。
我知道如何使用以下内容挂钩启动方法调用:@ApplicationScoped
结合@ManagedBean(eager=true)
和@PostConstruct
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()
会给我上下文路径。
但是,由于使用@PostConstruct
注释的方法未被请求触发(因为它非常渴望),getRequestContextPath()正在给我null
。
答案 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>