Servlet环境下访问tomcat服务器相关资源获取路径的几个方式

部署在tomcat上项目,要访问服务器上的资源或目录,都需要通过服务器的路径访问,初学tomcat。带以学习的态度对几种访问路径做一个学习总结。
首先可以看到在servlet中为我们提供了以下几个方法:
getContextPath(): 获取项目在服务器中的根目录
getServletPaht(): 获取当前servlet对象的虚拟路径。
getRealPath(String): 该方法通过ServletContext对象调用,获取项目在服务器中输出目录,也就是在webroot中的资源可以通过该方法获取路径访问资源。其中,文档对该方法的解释(表示不怎么看得明白)如下:
Servlet环境下访问tomcat服务器相关资源获取路径的几个方式_第1张图片
中文解释为:
为给定虚拟路径返回包含实际路径的 String。例如,可以通过对 “http://host/contextPath/index.html” 的请求使路径 “/index.html” 返回服务器文件系统上的绝对文件路径,其中 contextPath 是此 ServletContext 的上下文路径。
将采用与正在其上运行 servlet 容器的计算机和操作系统相适应的形式返回实际路径(包括采用适当的路径分隔符)。如果 servlet 容器由于某种原因无法将虚拟路径转换为实际路径(例如正从 .war 归档文件中获得内容时),则此方法返回 null。 path 指定虚拟路径的 String
return 指定实际路径的 String,如果无法执行转换,则返回 null

下图为我使用IDEA建立工程测试的结果:
Servlet环境下访问tomcat服务器相关资源获取路径的几个方式_第2张图片
疑惑之处在于:工程项目下存在一部分和输出目录一样得目录树,但是当用该方法时为什么会定位到输出目录?期待后续学习。望大神指定。。。

补充:在学习过程中也曾遇到使用到ServletContext中的getResource(String)及getResourceAsStream(String),在classpath输出目录下的资源;附上前者源码注解

/**
     * Finds a resource with a given name.  The rules for searching resources
     * associated with a given class are implemented by the defining
     * {@linkplain ClassLoader class loader} of the class.  This method
     * delegates to this object's class loader.  If this object was loaded by
     * the bootstrap class loader, the method delegates to {@link
     * ClassLoader#getSystemResource}.
     *
     * 

Before delegation, an absolute resource name is constructed from the * given resource name using this algorithm: * *

    * *
  • If the {@code name} begins with a {@code '/'} * ('\u002f'), then the absolute name of the resource is the * portion of the {@code name} following the {@code '/'}. * *
  • Otherwise, the absolute name is of the following form: * *
    * {@code modified_package_name/name} *
    * *

    Where the {@code modified_package_name} is the package name of this * object with {@code '/'} substituted for {@code '.'} * ('\u002e'). * *

* * @param name name of the desired resource * @return A {@link java.net.URL} object or {@code null} if no * resource with this name is found * @since JDK1.1 */

你可能感兴趣的:(web)