我正在尝试从应用程序启动时从ServletContext获取服务器URL(例如http://www.mywebapp.com/myapp),我这样做是通过在启动时调用bean方法(使用@Startup)并获取servlet上下文,
@Startup
@Name("startupActions")
@Scope(ScopeType.APPLICATION)
public class StartupActionsBean implements StartupActions,
Serializable {
@Logger private Log log;
/**
*
*/
private static final long serialVersionUID = 1L;
@Create
@Override
public void create(){
ServletContext sc = org.jboss.seam.contexts.ServletLifecycle.getServletContext();
String context = sc.getContextPath();
String serverInfo = sc.getServerInfo();
log.debug("__________________START__________________");
log.debug("Context Path: "+context);
log.debug("Server Info: "+serverInfo);
}
// Cleanup methods
@Remove
@BypassInterceptors
@Override
public void cleanUp(){}
}
这项工作正常,但ServletContext路径为空,请参阅下面的控制台输出..
18:52:54,165 DEBUG [uk.co.app.actions.startup.StartupActionsBean] __________________START__________________
18:52:54,165 DEBUG [uk.co.app.actions.startup.StartupActionsBean] Context Path:
18:52:54,165 DEBUG [uk.co.app.actions.startup.StartupActionsBean] Server Info: JBoss Web/3.0.0-CR1
有没有人知道如何通过这个或其他方式获取contextpath?
PS。使用SEAM 2.2.2,Jboss AS6 Final,Richfaces 3.3.3
答案 0 :(得分:1)
不要使用@Startup
,在完全设置上下文之前调用组件启动代码,而其他一些工厂尚未初始化。
观察org.jboss.seam.postInitialization
事件并使用相同的ServletLifecycle.getCurrentServletContext()
来获取所需的数据。一个简单的例子:
@Name("contextPath")
public class ContextPathInit implements Serializable {
private String contextPath;
@Observer("org.jboss.seam.postInitialization")
public void init() {
contextPath = ServletLifecycle.getCurrentServletContext().getContextPath();
}
}
答案 1 :(得分:0)
您是否尝试使用ExternalContext方法从getContextName获取该内容?
FacesContext.getCurrentInstance().getExternalContext().getContextName()