在应用程序启动时获取服务器上下文

时间:2012-09-23 18:13:10

标签: java servlets jboss seam seam2

我正在尝试从应用程序启动时从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

2 个答案:

答案 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()