【问题标题】:How to get web application path outside of a JSP page?如何在 JSP 页面之外获取 Web 应用程序路径?
【发布时间】:2010-11-26 16:05:37
【问题描述】:

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

我有一个 Web 过滤器类,它需要将 Web 请求重定向回当前 Web 应用程序的根目录。但是由于我们的应用程序没有部署在根目录中,所以我需要知道当前 Web 应用程序的路径。

例如http://www.mydomain.com/myapplication/index.htm

我需要获取“myapplicaiton”部分。

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

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

【问题讨论】:

  • 为什么您认为您无权访问您的 Filter 类中的 HttpServletRequest。对于通过 HTTP 运行的 Web 应用程序,您可以这样做。您可以在 doFilter() 方法中将 ServletRequest 转换为 HttpServletRequest。
  • @Asaph - 你是对的,假设我们正在谈论doFilter() 方法。 OP 可能会在 init() 中执行此操作。

标签: java jsp


【解决方案1】:

您要查找的方法是getContextPath() of javax.servlet.ServletContext

【讨论】:

    【解决方案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();
    

    当然,这不是可移植的。

    【讨论】:

      【解决方案3】:

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

      通常情况下,您想知道过滤器或 servlet 中的 init() 方法中的 contextPath。使用 2.5 版可以,但不能支持映射到多个 contextPath(尽管这很少会成为问题)。

      【讨论】:

        【解决方案4】:

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

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

        来自docs for RequestDispatcher

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

        如果你真的想让字符串对它做点什么,大多数其他解决方案就足够了。

        【讨论】:

          【解决方案5】:

          之前有人提到了一个 hack,它可以让你使用 Catalina ApplicationContext 对象来获取上下文路径。

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

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

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

          这些 hack 将有效,但仅适用于 Tomcat 5.5.16 或更高版本的 catalina.jar 文件,因为该方法在以前的版本中未实现。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多