【问题标题】:How to get ContextPath in init() method of Servlet version 2.4如何在 Servlet 2.4 版的 init() 方法中获取 ContextPath
【发布时间】:2012-12-02 12:35:40
【问题描述】:

我使用的是Servlet 2.4 版,我需要通过在服务器启动时调用的init() 方法获取ContextPath,所以我没有任何Request 对象 可以调用 getContextPath() 并且因为 Servlet 版本我在 ServletContext 中也没有 getContextPath() 方法。

有没有办法以某种方式得到这个ContextPath()

【问题讨论】:

标签: java servlets contextpath


【解决方案1】:

试试这个代码:

class demo extends HttpServlet {
       public void init(ServletConfig config) {
             String path = config.getServletContext().getRealPath("/");
       }
}

它应该可以工作

【讨论】:

  • 这将给出 webapp 目录的真实文件系统路径(例如/var/tomcat/webapps/foo),而不是部署应用程序的上下文路径(/foo)。正如 krampstudio 所说,Servlet 2.5 将 getContextPath() 添加到 ServletContext,返回应用程序的“主要”上下文路径,但在 2.4 或更早版本中,您只能获取特定请求的路径。
【解决方案2】:

似乎只有 servlet 2.5 才有可能,如本文所述:ServletContext getContextPath()

【讨论】:

    【解决方案3】:

    你是对的,在 Servlet 2.4 中,ServletContext 对象没有 getContextPath 方法。

    我可以建议两个选项:

    1. 将上下文路径设置为servlet的参数:

      <servlet>

      <servlet-name>initServlet</servlet-name>
      
      <servlet-class>net.cirrus-it.InitServlet`</servlet-class>
      
      <init-param>
              <param-name>contextPath</param-name>
              <param-value>/myApp</param-value>
      </init-param>
      

      &lt;/servlet>

    2. 尝试通过getRealPath()方法判断上下文路径

    http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

    根据文档:

    返回一个字符串,其中包含给定虚拟路径的真实路径。 例如,路径“/index.html”返回文件的绝对路径 服务器的文件系统将由请求提供服务 “http://host/contextPath/index.html”,其中contextPath是这个ServletContext的上下文路径

    【讨论】:

      【解决方案4】:

      一个 Web 应用程序可以在多个不同的上下文路径中发布,因此 上下文路径(单数)仅在特定请求的上下文中才有意义。 Servlet 2.5 将 getContextPath() 添加到 ServletContext,指定返回此 Web 应用程序的“主要”上下文路径,但在早期规范版本中没有独立于容器的方式来访问此信息。

      可能有一些技巧适用于某些容器,例如在 Tomcat 上,ServletContext.getResource() 方法返回带有自定义方案的 URL,格式为 jndi://hostname/context/...。因此您可以使用

      ctx.getResource("/").getPath()
      

      获取 Tomcat 上的上下文路径(或者可能是 getResource("/WEB-INF/web.xml") 并修剪尾部,因为如果您要求它提供不存在的文件,getResource() 被指定返回 null)。您必须尝试不同的容器,才能找到适用于这些容器的类似技巧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-08
        • 2012-07-16
        • 1970-01-01
        • 2011-09-30
        相关资源
        最近更新 更多