如何在JSP页面之外获取Web应用程序路径?

时间:2009-09-08 22:35:42

标签: java jsp

我是JSP和Java EE的新手。所以也许有一些非常明显的我错过了。

我有一个Web过滤器类,需要将Web请求重定向回当前Web应用程序的根目录。但由于我们的应用程序未部署在根目录中,因此我需要了解当前Web应用程序的路径。

e.g。 http://www.mydomain.com/myapplication/index.htm

我需要获得“myapplicaiton”部分。

我尝试过ServletContext,ApplicationContext没有成功。我意识到我可以从HttpServletRequest获取它但我在我的过滤器类中无法访问它。

请帮忙。我被卡住了。我来自.NET世界。这在那里很容易。

5 个答案:

答案 0 :(得分:2)

根据您的Servlet版本,如果没有请求,您可能无法获得它。在Servlet 2.5之前,它假设servlet可能有多个上下文路径,因此您只能从请求中获取它。这在2.5中已更改,并添加了ServletContext.getContexPath()

如果您在doFilter()中需要此功能,则可以访问该请求。如果您真的想在Tomcat 5.5或更早版本的init()中执行此操作,则可以执行hack,

String contextPath = ((org.apache.catalina.core.ApplicationContext)filterConfig.getSevletContext()).getContextPath();

当然,这不可移植。

答案 1 :(得分:1)

您正在寻找的方法是getContextPath()javax.servlet.ServletContext

答案 2 :(得分:0)

您正在寻找的部分是contextPath,直到Servlet版本2.5,获取contextPath的唯一方法是通过在HttpServletRequest类上调用方法getContextPath()。这意味着您只能按要求获取一个请求。这与您的webapp可以映射到多个contextPath的事实有关。从版本2.5开始,您可以从ServletContext类获取contextPath,如果您的webapp映射到多个contextPath,您将获得主要或首选的contextPath(由容器决定)。

通常情况下,您希望在过滤器或servlet中的init()方法中了解contextPath。使用2.5版本,你可以,但是你将无法支持被映射到多个contextPath(虽然这很少是一个问题)。

答案 3 :(得分:0)

如果您只想将用户转发到根上下文,则可以在过滤器的doFilter方法中执行此操作。这假设您从Filter init方法中的FilterConfig中抓取context

    context.getRequestDispatcher("/").forward(request, response);

来自docs for RequestDispatcher

  

路径名必须以“/”开头,并且被解释为相对于当前上下文根。

如果您确实希望字符串对其执行某些操作,那么大多数其他解决方案就足够了。

答案 4 :(得分:0)

之前有人提到过hack,它允许您使用Catalina ApplicationContext对象来获取上下文路径。

String contextPath = ((org.apache.catalina.core.ApplicationContext)filterConfig.getSevletContext()).getContextPath();

您也可以在ServletContextListener中使用它,并在您的webapp启动时转储路径:

ApplicationContext tomcatContext = (ApplicationContext)event.getServletContext();
    String contextPath = tomcatContext.getContextPath();

这些黑客可以使用,但只能使用Tomcat 5.5.16或更高版本的catalina.jar文件,因为该方法在以前的版本中没有实现。