JavaEE路径陷阱之getRealPath

转自:http://blog.csdn.net/shendl/article/details/1427637

 
JavaEE
路径陷阱之getRealPath

本文是《Java路径问题最终解决方案—可定位所有资源的相对路径寻址》一文的姐妹篇。请同时阅读该文。

JavaEE程序有一大路径陷阱,那就是ServletContext的getRealPath方法。我们常常使用getRealPath(“/”)来获得Web应用程序根目录的绝对路径。这是绝对要不得的!提供这个方法绝对是JavaEE
API开发组的一大败笔。使用它,我们会万劫不复!

绝对不要使用ServletContext的getRealPath方法获取Web应用的路径!应该使用ServletContext的getResource()方法,直接使用相对于Web应用根目录的相对路径来获取资源。

ServletContext接口中定位资源的方法

getResource

java.net.URL getResource(java.lang.String path)

throws
java.net.MalformedURLException

Returns a URL to the resource that is mapped to a
specified path. The path must begin with a "/" and is interpreted as relative to
the current context root.

This method allows the servlet container to make a
resource available to servlets from any source. Resources can be located on a
local or remote file system, in a database, or in a .war file.

The servlet container must implement the URL handlers
and URLConnection objects that are necessary to access the
resource.

This method returns null if no resource is mapped to the
pathname.

Some containers may allow writing to the URL returned by
this method using the methods of the URL class.

The resource content is returned directly, so be aware
that requesting a .jsp page returns the JSP source code. Use a RequestDispatcher
instead to include results of an execution.

This method has a different purpose than
java.lang.Class.getResource, which looks up resources based on a class loader.
This method does not use class loaders.

Parameters:

path - a String specifying the path to the
resource

Returns:

the resource located at the named path, or null if there
is no resource at that path

Throws:

java.net.MalformedURLException - if the pathname is not
given in the correct form


getResourceAsStream

java.io.InputStream getResourceAsStream(java.lang.String path)

Returns the resource located at the named path as an
InputStream object.

The data in the InputStream can be of any type or
length. The path must be specified according to the rules given in getResource.
This method returns null if no resource exists at the specified
path.

Meta-information such as content length and content type
that is available via getResource method is lost when using this
method.

The servlet container must implement the URL handlers
and URLConnection objects necessary to access the resource.

This method is different from
java.lang.Class.getResourceAsStream, which uses a class loader. This method
allows servlet containers to make a resource available to a servlet from any
location, without using a class loader.

Parameters:

path - a String specifying the path to the
resource

Returns:

the InputStream returned to the servlet, or null if no
resource exists at the specified path

getRealPath

java.lang.String getRealPath(java.lang.String path)

Returns a String containing the real path for a given
virtual path. For example, the path "/index.html" returns the absolute file path
on the server‘s filesystem would be served by a request for
"http://host/contextPath/index.html", where contextPath is the context path of
this ServletContext..

The real path returned will be in a form appropriate to
the computer and operating system on which the servlet container is running,
including the proper path separators. This method returns null if the servlet
container cannot translate the virtual path to a real path for any reason (such
as when the content is being made available from a .war archive).

Parameters:

path - a String specifying a virtual path

Returns:

a String specifying the real path, or null if the
translation cannot be performed

说明

可以看到,ServletContext接口中的getResource()等方法,可以找到任何从应用程序的根目录开始的资源。包括在.war包这样的压缩文件中。参数必须以/开头。

而我们常用的getRealPath(“/”)方法,在.war包发布时,就会失效。会返回null。

因此,我们应该避免使用getRealPath(“/”)这样的方法来获取应用程序的绝对路径。

如果你不想使用我在《Java路径问题最终解决方案—可定位所有资源的相对路径寻址》中提出的助手类ClassLoaderUtil 的public static URL getExtendResource(String relativePath)方法,那么你应该使用ServletContext接口的
java.net.URL getResource(java.lang.String path)
                         throws java.net.MalformedURLException

方法,URL对象可以方便的转为URI,和String对象。

尽管没有ServletContext的源码,但是我可以猜想到getResource等方法一定在底层使用了ClassLoader的getResource方法。

JavaEE路径陷阱之getRealPath,布布扣,bubuko.com

时间: 2024-11-03 21:41:18

JavaEE路径陷阱之getRealPath的相关文章

从request获取各种路径总结 request.getRealPath("url")

转载:http://blog.csdn.net/piaoxuan1987/article/details/8541839 equest.getRealPath() 这个方法已经不推荐使用了,代替方法是: request.getSession().getServletContext().getRealPath() 从Request对象中可以获取各种路径信息,以下例子: 假设请求的页面是index.jsp,项目是WebDemo,则在index.jsp中获取有关request对象的各种路径信息如下 S

JavaEE路径

相对路径与绝对路径 相对路径与绝对路径的区别(引用) 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径).例如:C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://www.sun.com/index.htm 代表了一个URL绝对路径. 相对路径:相对与某个基准目录的路径.包含Web的相对路径(HTML中的相对目录),例如:在Servlet中,"/"代表Web应用的根目录.和物理路径的相对表示,例如:"./&qu

JavaEE实战——Servlet入门、Servlet生命周期、绝对路径、ServletContext

前言 接下来的三篇博客我会分别介绍Servlet的以下三个方面: 1.Servlet程序编写 ----- 生命周期 2.ServletAPI Request Response 3.Cookie 和 Session Servlet的作用:Servlet 用来 动态web资源 开发 静态web资源 : 固定数据文件 动态web资源 : 通过程序动态生成数据文件 Servlet技术基于Request-Response编程模型 ---- HTTP协议也是基于请求响应 模型 * Servlet技术 用来

JavaEE 获取路径全攻略

本篇博客是 JavaWeb 应用服务器端在不同环境下获取文件路径的全面总结. 获取文件路径后主要应用的场景,读取 JavaWeb 自定义配置文件.在特定路径下生成各种类型的文件提供下载...... 想必看官也是来找方法的,先看上面目录有没有能解决你问题的,如果有就点击进到对应小节,如果没有速度关闭,看搜索引擎列出来的下一条记录吧. 1.Servlet 的init 方法中获取 getServletContext().getRealPath("/"); output :E:\workspa

JAVA文件中获取路径及WEB应用程序获取路径方法

原文转自:http://www.tqcto.com/article/recommend/141.html 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了test.txt文件的绝对路径: http://www.sun.com/index.htm也代表了一个URL绝对路径: `相对路径`:相对与某个基准目录的路径,包含Web的相对路径(HTML中的相对目录). 例如: 在Servlet中,"/"

绝对路径与相对路径问题

首先辨析"/"与"\" window中的路径一般用"\": java中的路径一般用"/":如果用"\"需要对其转义成"\\" 1.绝对路径 以根目录作为参考点的的文件或文件夹所在的路径,是硬盘上的真实路径.具有唯一性的特点. 例如:C:\caosiege\python\project\C.py,代表的是C.txt的绝对路径 2.相对路径 相对于某个基准目录的路径.不具有唯一性. 例如:在

jsp中获得的路径的方法

以工程名为TEST为例: (1)得到包含工程名的当前页面全路径:request.getRequestURI() 结果:/TEST/test.jsp (2)得到工程名:request.getContextPath() 结果:/TEST (3)得到当前页面所在目录下全名称:request.getServletPath() 结果:如果页面在jsp目录下 /TEST/jsp/test.jsp (4)得到页面所在服务器的全路径:application.getRealPath("页面.jsp") 

关于J2EE里面getContextPath()和getRealPath()的区别

一直老搞不清楚这两个方法的区别,只知道他们都是拿来获取地址的.今天特意写了个小demo试了一下,代码如下: @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { ServletContext context=arg0.getServletContext(); String contextPath=conte

java(web)相对路径,绝对路径

1.定义 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:/xyz/test.txt 代表了test.txt文件的绝对路径.http://www.baidu.com/index.htm也代表了一个URL绝对路径. 相对路径:相对与某个基准目录的路径.包含Web的相对路径(HTML中的相对目录),例如:在Servlet中,"/"代表Web应用的根目录.和物理路径的相对表示.例如:"./" 代表当前目录,"../&