文档章节

Tomcat 8 关于 getRealPath 的一个问题

glen_xu
 glen_xu
发布于 2015/07/07 11:54
字数 312
阅读 199
收藏 1

ServletContext.getRealPath() 是从当前servlet 在tomcat 中的存放文件夹开始计算起的


比如,有个servlet 叫 UploadServlet,它部署在tomcat 下面以后的绝对路径如下:

"C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"


那么,

ServletContext.getRealPath("/") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"

ServletContext.getRealPath("/attachment") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet\attachment"

ServletContext.getRealPath("attachment") 会导致NullPointerException


结论就是:

在使用ServletContext.getRealPath() 时,传入的参数是从 当前servlet 部署在tomcat中的文件夹算起的相对路径,要以"/" 开头,否则会找不到路径,导致NullPointerException


解决问题过程中,发现这位大哥做了类似的记录 ServletContext .getRealPath,但其观点,不敢苟同。自己观察到的结果是:

ServletContext.getRealPath("/") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"

ServletContext.getRealPath("/") + "xxx" 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServletxxx"

ServletContext.getRealPath("/") + "/xxx" 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet\xxx"

即,getRealPath() 返回的字符串结尾不带"/"


注意,Windows下,在Eclipse debug过程中,看到的getRealPath() 返回的字符串其实是长这样子的:

"C:\\Program Files\\apache-tomcat-8.0.3\\webapps\\UploadServlet\\attachment"

"\\"中的第一个"\"是转义符,你懂的。


BTW,刘京华的《Java Web整合开发 之 王者归来》第71页代码中的 getRealPath("attachment") 以及附带光盘中的代码,着实坑爹……


© 著作权归作者所有

共有 人打赏支持
glen_xu
粉丝 10
博文 132
码字总数 18057
作品 0
济南
私信 提问
Tomcat 8 关于 getRealPath 的一个问题

请看下面这行代码: 使用 Tomcat 版本是 8.0 RC5 如果 Web 根路径存在 test 这样的文件或者文件夹,那么 path 可以得到这个 test 对应的全路径。但如果 test 不存在,那么上面代码得到的 pa...

红薯
2013/12/03
1K
7
ServletContextFactory.getServletContext().getRealPath("/")返回值问题,求解?见正文

ServletContextFactory.getServletContext().getRealPath("/") 在其他同事电脑上,都是直接读取的项目的真实路径,而本机得到的一直都是eclipse发布后的路径,请问这是哪里配置的有问题呢?我...

streamlong
2016/08/15
536
0
Tomcat部署时war和war exploded(可以热部署)

war和war exploded的区别 war模式:将WEB工程以包的形式上传到服务器 ; war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布; war exploded模式:将WEB工程以当前文件...

职业搬砖20年
2018/10/15
0
0
getRequestURI,getRequestURL的区别

getRequestURI,getRequestURL的区别 test1.jsp======================= <a href ="test.jsp?p=fuck">跳转到test2</a> test2.jsp======================= <%@ page language="java" import="j......

java-苦苦甜甜
2014/04/17
0
0
Spring mvc 基于注解的图片上传

如题, 做一个和osc个人资料修改 图像的功能(类似于博客的小项目)。 问题是:1.图片保存路径放在哪比较好 2.前台的上传,显示,缩略图生产,及时更新图像功能 我的做法: jar包: commons-...

zerohh
2013/03/07
921
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
5
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部