本篇博客是 JavaWeb 应用服务器端在不同环境下获取文件路径的全面总结。

获取文件路径后主要应用的场景,读取 JavaWeb 自定义配置文件、在特定路径下生成各种类型的文件提供下载......

想必看官也是来找方法的,先看上面目录有没有能解决你问题的,如果有就点击进到对应小节,如果没有速度关闭,看搜索引擎列出来的下一条记录吧。

1.Servlet 的init 方法中获取

getServletContext().getRealPath("/");

output :E:\workspace\tree\  (tree是我web项目的根目录)

2.任意的class中获取

this.getClass().getClassLoader().getResource("/").getPath();
Thread.currentThread().getContextClassLoader().getResource("/").getPath();

output : E:\workspace\tree\WEB-INF\classes\

3.HttpServletRequest 中获取

request.getServletContext().getRealPath("/");

output:E:\Workspaces\tree\WebContent\

weblogic 下 request.getServletContext() 路径获取为空,其原因是 servlet-api.jar 本地和 weblogic 上有差别。

换用 request.getSession().getServletContext().getRealPath("/")  可以解决问题,但这样的话你需要判断容器。

最好是取类加载路径也就是第二种方式,web 相对路径,然后获取你想要的资源。

4.jsp取得当前目录的路径

request.getRealPath("");

path=C:\jboss-4.0.5.GA\server\default\tmp\deploy\tmp14544test-exp.war\

(String)request.getContextPath();

得到项目(test)应用所在的真实的路径 path=/test

request.getRequestURI();

得到应用所在的真实的路径 path=/test/admin/admindex.jsp

request.getRealPath(request.getServletPath());

得到当前文件的磁盘绝对路径

5.服务器端的地址

服务器端的相对地址指的是相对于你的web应用的地址。这个地址是在服务器端解析的(不同于 html 和 javascript 中的相对地址,他们是由客户端浏览器解析的)

也就是说这时候在 jsp 和 servlet 中的相对地址应该是相对于你的web应用,即相对于http: //192.168.0.1/webapp/的。

Forward:servlet 中的 request.getRequestDispatcher(address); 这个 address 是在服务器端解析。

你要 forward 到 a.jsp 应该这么写:request.getRequestDispatcher(“/user/a.jsp”)

这个 / 相对于当前的 web 应用 webapp,其绝对地址就是:http://192.168.0.1/webapp/user/a.jsp。

sendRedirect:在 jsp 中 <%response.sendRedirect("/rtccp/user/a.jsp");%>

6.客户端的地址

所有的 html 页面中的相对地址都是相对于服务器根目录(http://192.168.0.1/)的。

而不是(跟目录下的该Web应用的目录) http://192.168.0.1/webapp/的。

Html 中的 form 表单的 action 属性的地址应该是相对于服务器根目录 (http://192.168.0.1/) 的。

如果提交到 a.jsp 为:action="/webapp/user/a.jsp" 或 action="<%=request.getContextPath()% >"/user/a.jsp;

提交到 servlet 为 actiom="/webapp/handleservlet"  Javascript 也是在客户端解析的,所以其相对路径和 form 表单一样。

因此,一般情况下,在 jsp/html 页面等引用的 css,javascript.action等属性前面最好都加上 <%=request.getContextPath()%>,确保所引用的文件属于 Web 应用。

另外,应该尽量避免使用类似 ".","./","../../" 等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。

7.Servlet中获得当前应用的相对路径和绝对路径

a.根目录所对应的绝对路径:request.getServletPath();

b.文件的绝对路径 :request.getSession().getServletContext().getRealPath(request.getRequestURI())

c.当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");

javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()

d..Java 的Class中获得相对路径,绝对路径的方法

根据java.io.File的Doc文挡,可知:默认情况下new File("/")代表的目录为:System.getProperty("user.dir")。

        System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));System.out.println(Test.class.getClassLoader().getResource(""));System.out.println(ClassLoader.getSystemResource(""));System.out.println(Test.class.getResource(""));System.out.println(Test.class.getResource("/"));System.out.println(new File("/").getAbsolutePath());System.out.println(System.getProperty("user.dir"));

8.Web服务器中的Java类获得当前路径

WebApplication的系统文件根目录是你的weblogic安装所在根目录。

例如:如果你的weblogic安装在c:beaweblogic700.....

那么,你的文件根路径就是 c: 所以,有两种方式能够让你访问你的服务器端的文件。

使用绝对路径:比如将你的参数文件放在 c:yourconfigyourconf.properties。

new FileInputStream("yourconfig/yourconf.properties");

使用相对路径:相对路径的根目录就是你的webapplication的根路径,即 WEB-INF 的上一级目录,将你的参数文件放在 yourwebappyourconfigyourconf.properties。

new FileInputStream("./yourconfig/yourconf.properties");

tomcat:在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin

取当前项目的根目录下资源的方法:

//因为类名为"Application",因此" Application.class"一定能找到
String result = Application.class.getResource("Application.class").toString();
int index = result.indexOf("WEB-INF");
if(index == -1)...{
index = result.indexOf("bin");
}
result = result.substring(0,index);
if(result.startsWith("jar"))...{
// 当class文件在jar文件中时,返回"jar:file:/F:/ ..."样的路径
result = result.substring(10);
}else if(result.startsWith("file"))...{
// 当class文件在class文件中时,返回"file:/F:/ ..."样的路径
result = result.substring(6);
}
if(result.endsWith("/"))result = result.substring(0,result.length()-1);//不包含最后的"/"
return result; 

9.JavaScript获取项目根目录

//js获取项目根路径,如: http://localhost:8083/uimcardprj
function getRootPath(){//获取当前网址,如: http://localhost:8083/uimcardprj/share/meun.jspvar curWwwPath=window.document.location.href;//获取主机地址之后的目录,如: uimcardprj/share/meun.jspvar pathName=window.document.location.pathname;var pos=curWwwPath.indexOf(pathName);//获取主机地址,如: http://localhost:8083var localhostPaht=curWwwPath.substring(0,pos);//获取带"/"的项目名,如:/uimcardprjvar projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1);return(localhostPaht+projectName);
}

10.对ClassLoader的一点理解

在任意class中使用到了getClassLoader():取得该Class对象的类装载器,对于classLoader 的认识还是在后续工作中接触后不断建立起来。

装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。

Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器.

类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?

确实存在这样的根,它就是神龙见首不见尾的Bootstrap ClassLoader. 为什么说它神龙见首不见尾呢?

因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,

尽管你能时时刻刻体会到它的存在,因为java的运行环境所需要的所有类库,都由它来装载,而它本身是C++写的程序,可以独立运行,可以说是JVM的运行起点,颤抖吧,骚年!

在Bootstrap完成它的任务后,会生成一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类)。

这个类装载器才是我们经常使用的,可以调用ClassLoader.getSystemClassLoader() 来获得。

我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。

AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵光一闪的感觉,我们按照它的类查找范围给它取名为类路径类装载器。

JavaEE 获取路径全攻略相关推荐

  1. 《电脑音乐制作实战指南:伴奏、录歌、MTV全攻略》——第2章 音频伴奏的获取与制作 2.1 获取伴奏的途径...

    本节书摘来自异步社区<电脑音乐制作实战指南:伴奏.录歌.MTV全攻略>一书中的第2章,第2.1节,作者 健逗,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第2 ...

  2. 组策略分发软件全攻略

    组策略分发软件全攻略 在规模比较大的网络环境里面,为了对服务器和客户机上的软件.系统补丁进行集中统一的管理,我们可能会用到SUS.WSUS.SMS等.SUS.WSUS管理系统更新,不在本文讨论,请参考 ...

  3. Retrofit全攻略——进阶篇

    最近事比较多,距离上次写文章已经过去了一个月了.上一篇文章Retrofit全攻略--基础篇 介绍了Retrofit的基础用法,这篇文章介绍点进阶的用法. 打印网络日志 在开发阶段,为了方便调试,我们需 ...

  4. [转载]Linux用户管理全攻略(八)

    原文地址:Linux用户管理全攻略(八)作者:ZOL_心蓝蓝 Linux 系统中的超级权限的控制 作者:北南南北 赞助: eTony,pandonny,懒猫, Arch 来自:LinuxSir.Org ...

  5. Gradle脚本基础全攻略

    转载http://blog.csdn.net/yanbober/article/details/49314255 [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处 ...

  6. VSCode插件开发全攻略(六)开发调试技巧

    更多文章请戳VSCode插件开发全攻略系列目录导航. 前言 在介绍完一些比较简单的内容点之后,我觉得有必要先和大家介绍一些开发中遇到的一些细节问题以及技巧,特别是后面一章节将要介绍WebView的知识 ...

  7. 用C#制作PDF文件全攻略(转)

    PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段"暴力"破解 ...

  8. 用C# itextsharp.dll制作PDF文件全攻略

    StreamWriter pPDF=new StreamWriter(filePath); ArrayList xRefs=new ArrayList(); float yPos =0f; long ...

  9. 用C#制作PDF文件全攻略 (专至csdn)

    前 言 丽水市汽车运输集团有限公司信息中心 苟安廷 PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜 ...

最新文章

  1. 开发者,只有被裁,没有退休
  2. 一名毕业三年的女程序媛面试头条经验,重难点整理
  3. angular之Rxjs异步数据流编程入门
  4. ubuntu14.04下的NVIDIA Tesla K80显卡驱动的安装教程
  5. 用宏定义代替printf函数
  6. SDK 和 API 的区别是什么?
  7. hdu 2686 Matrix 最大费用最大流
  8. 集合还有这么优雅的运算法?
  9. oo0ooo0ooo0oo_OoO的完整形式是什么?
  10. 洛谷——P1311 选择客栈
  11. 用VS2013编译FFMPEG232
  12. php 无符号位移怎么使用,,(有符号位移)和(无符号位移)的使用方法,及差别...
  13. @Resource真的只是按名称来进行依赖注入吗?@Autowired真的只是按照类型来依赖注入吗?
  14. 【实习之T100开发】帆软报表笔记
  15. 相似图片搜索算法介绍
  16. 51单片机读取引脚值原理
  17. 神经网络论文Enhancing deep neural networks via multiple kernel learning
  18. 江苏计算机一级证书考试试题,2016年江苏省计算机一级考试试题
  19. linux触摸板开关快捷键,Ubuntu增加快捷键打开或关闭触摸板
  20. 二维数组应用——扫雷

热门文章

  1. Apache Solr schema.xml及solrconfig.xml文件中文注解
  2. websocket工作原理
  3. 借书证信息管理系统,C语言实现
  4. 广度优先搜索 BFS算法
  5. topcoder srm 330 div1
  6. Eclipse 代码风格配置
  7. CentOS系统安装(上):图形/文本界面安装
  8. 在Java中如何使用transient
  9. Exchange 2007邮件服务器
  10. mongoose常用方法(查询篇)