(转)相对路径和绝对路径的区别,java获取项目访问路径的方法_油菜花啊的博客-程序员秘密

相对路径和绝对路径的区别 


在HTML里只要涉及文件的地方(如超级链接、图片等)就会涉及绝对路径与相对路径的概念。 


1.绝对路径 
    绝对路径是指文件在硬盘上真正存在的路径。例如“bg.jpg”这个图片是存放在硬盘的“E:\book\网页布局代码\第2章”目录下,那么 “bg.jpg”这个图片的绝对路径就是“E:\book\网页布\代码\第2章\bg.jpg"。那么如果要使用绝对路径指定网页的背景图片就应该使用 以下语句: 
<body backround="E:\book\网页布局\代码\第2章\bg.jpg" > 


  2.使用绝对路径的缺点 
   事实上,在网页编程时,很少会使用绝对路径,如果使用“E:\book\网页布\代码\第2章\bg.jpg”来指定背景图片的位置,在自己的计算机上 浏览可能会一切正常,但是上传到Web服务器上浏览就很有可能不会显示图片了。因为上传到Web服务器上时,可能整个网站并没有放在Web服务器的E盘, 有可能是D盘或H盘。即使放在Web服务器的E盘里,Web服务器的E盘里也不一定会存在“E:\book\网页布局\代码\第2章”这个目录,因此在浏 览网页时是不会显示图片的。 


  3.相对路径 
    为了避免这种隋况发生,通常在网页里指定文件时,都会选择使用相对路径。所谓相对路径,就是相对于自己的目标文件位置。例如上面的例子,“s1.htm” 文件里引用了“bg.jpg”图片,由于“bg.jpg”图片相对于“s1.htm”来说,是在同一个目录的,那么要在“s1.htm”文件里使用以下代 码后,只要这两个文件的相对位置没有变(也就是说还是在同一个目录内),那么无论上传到Web服务器的哪个位置,在浏览器里都能正确地显示图片。 
      <body background="bg.jpg"> 
再 举一个例子,假设“s1.htm”文件所在目录为“E:\book\网页布局\代码\第2章”,而“bg.jpg”图片所在目录为“E:\book\网页 布局\代码\第2章\img”,那么“bg.jpg”图片相对于“s1.htm”文件来说,是在其所在目录的“img”子目录里,则引用图片的语句应该 为: 
      <body background="img/bg.jpg">  


    注意:相对路径使用“/”字符作为目录的分隔字符,而绝对路径可以使用“\”或“/”字符作为目录的分隔字符。由于“img”目录是“第2章”目录下的子目录,因此在“img”前不用再加上“/”字符。 
在 相对路径里常使用“../”来表示上一级目录。如果有多个上一级目录,可以使用多个“../”,例如“http://www.cnblogs.com/”代表上上级目录。假设 “s1.htm”文件所在目录为“E:\book\网页布局\代码\第2章”,而“bg.jpg”图片所在目录为“E:\book\网页布局\代码”,那 么“bg.jpg”图片相对于“s1.htm”文件来说,是在其所在目录的上级目录里,则引用图片的语句应该为: 
      <body background="../bg.jpg">  


  再举一个例子,假设“s1.htm”文件所在目录为“E:\book\网页布局\代码\第2章”,而“bg.jpg”图片所在目录为“E:\book\网 页布局\代码\img”,那么“bg.jpg”图片相对于“s1.htm”文件来说,是在其所在目录的上级目录里的“img”子目录里,则引用图片的语句 应该为: 
      <body background="../img/bg.jpg">  


4.相对虚拟目录 
有关相对路径还有一个比较特殊的表示:“相对虚拟目录”。请看下面的例子: 
      <body background="/img/bg.jpg">  


  在这个例子里,background属性的值为“/img/bg.jpg”,注意在“img”前有一个“/”字符。这个“/”代表的是虚拟目录的根目录. 假设把“E:\book\网页布局\代码”设为虚拟目录,那么“/img/bg.jpg”的真实路径为“E:\book\网页布局\代码\img \bg.jpg”;如果把“E:\book\网页布局\代码\第2章”设为虚拟目录,那么“/img/bg.jpg”的真实路径为“E:\book\网页 布局\代码\第2章\img\bg.jpg” 


在jsp和class文件中调用的相对路径不同。 


在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获取你工程的绝对路径。 


1.jsp中取得路径: 
以工程名为TEST为例: 
(1)得到包含工程名的当前页面全路径:request.getRequestURI() 
结果:/TEST/test.jsp 
(2)得到工程名:request.getContextPath() 
结果:/TEST 
(3)得到当前页面所在目录下全名称:request.getServletPath() 
结果:如果页面在jsp目录下 /TEST/jsp/test.jsp 
(4)得到页面所在服务器的全路径:application.getRealPath("页面.jsp") 
结果:D:\resin\webapps\TEST\test.jsp 
(5)得到页面所在服务器的绝对路径:absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent();
结果:D:\resin\webapps\TEST 


2.在类中取得路径: 
(1)类的绝对路径:Class.class.getClass().getResource("/").getPath() 
结果:/D:/TEST/WebRoot/WEB-INF/classes/pack/ 
(2)得到工程的路径:System.getProperty("user.dir") 
结果:D:\TEST 


3.在Servlet中取得路径: 
(1)得到工程目录:request.getSession().getServletContext().getRealPath("") 参数可具体到包名。 
结果:E:\Tomcat\webapps\TEST 
(2)得到IE地址栏地址:request.getRequestURL() 
结果:http://localhost:8080/TEST/test 
(3)得到相对地址:request.getRequestURI() 
结果:/TEST/test 


另,Class类还有一个getResourceAsStream方法,记得以前有个项目要读取在同一个包内的一个xml,就用的这个。 


1.如何获得当前文件路径 


常用: 
(1).Test.class.getResource("") 
得到的是当前类FileTest.class文件的URI目录。不包括自己! 
(2).Test.class.getResource("/") 
得到的是当前的classpath的绝对URI。 
(3).Thread.currentThread().getContextClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI。 
(4).Test.class.getClassLoader().getResource("") 
得到的也是当前ClassPath的绝对URI。 
(5).ClassLoader.getSystemResource("") 
得到的也是当前ClassPath的绝对URI。 
尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径,后面可以看出得出结果五花八门。 
(6) new File("").getAbsolutePath()也可用。 


注:若这些路径中出现空格,并且空格被 代替,则可以使用path = java.net.URLDecoder.decode(path,"utf-8") 进行转化; 
       
2.Web服务器 
(1).Tomcat 
在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin 
(2).Resin 
不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成Servlet的路径为根.比如用新建文件法测试File f = new File("a.htm"); 
这个a.htm在resin的安装目录下 
(3).如何读文件 
使用ServletContext.getResourceAsStream()就可以 
(4).获得文件真实路径 


String   file_real_path=ServletContext.getRealPath("mypath/filename");  
不建议使用request.getRealPath("/");
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/harryzzz/article/details/78754683

智能推荐

炎炎夏日,看小Y重燃烈焰战火——Y450外接显卡_Ac_tra的博客-程序员秘密

目录前言实际效果预算VS结算配件开箱硬件连接软件环境配置(重点)

Activity切换动画_activity 切换动画csdn_高平后生的博客-程序员秘密

1.在sttrs文件中定义动画(渐变、缩放等)。>渐变<alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500" android:fromAlpha="0.0" android:toAlpha="1.0" android:interpolat

Windows系统如何安装及启动Eric6_eric-ide怎么启动_一个业余写代码的的博客-程序员秘密

前言:前段时间因为升级了PyQt5和PyQt5-tools版本,4.19.8版本升至5.13.0.5,导致之前从Eric6官网安装的版本号为18.6的Eric6再启动的时候发现保存UI可以保存,但是编译UI界面的时候发现有问题了,可能是ERIC6的版本对不上PYQT5。所以说有些库还是不要乱升级!搞得我有2个月没用ERIC6了,在这时候呢,我发现PYPI官网已经有人上传了eri...

Rebuild EM注意事项_weixin_34041003的博客-程序员秘密

最近兄弟公司昆山厂发生一次oracle异常,是DBA在rebuild EM时所有用户无法使用。我一直以为他是在rebuild之后发生的。今天看到他的mail才明白,原来他是在删除EM的过程中不能用。 这个问题我在7月份也遇到过。当时在测试环境作完修改IP重建EM之后,就在中午12点重建正式库的EM,结果产线报告程序无法使用,就赶紧停止了。后来在测试环境...

Matlab实现Taylor展开近似计算、五角星画法_五角形数mathlab_Victor.wzl的博客-程序员秘密

x=1:0.01:2;m=length(x);s=ones(1,m).*x;term=ones(1,m).*x;n=1;while max(abs(term))&gt;eps n=n+1; term=(-1).*(x/(2*n-1)).*(x/(2*n-2)).*term; s=s+term;endplot(x,s,'r');hold on;plot(x,sin(x),'--')输出结果:theta=(pi/10:4*pi/5:41*pi/10);z=e.

使用基于 Eclipse 插件框架的 ODA(Open Data Access)进行自定义数据驱动开发_chenghuang2019的博客-程序员秘密

ODA 之所以能够有如此强的灵活性,是因为: 它提供了一套完整的接口,开发者可以自己去实现数据源的访问逻辑,使得数据源对数据使用者变得透明。只要开发者遵循编程规范,就可以对任何数据进行驱动。 它基于 Eclipse 的 plugin 框架,可以通过 Eclipse 的扩展点方便地连...

随便推点

Python调用科大讯飞C语言接口(语音听写linux sdk)实现语音识别_python调用c的sdk_怎么会这样!的博客-程序员秘密

Python调用科大讯飞C语言接口实现语音识别https://blog.csdn.net/fang_yang_wa/article/details/78791137

【C语言】汉诺塔问题。_白驹_过隙的博客-程序员秘密

汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放到第二根柱子上,并且规定,每次只能移动一个圆盘,在小圆盘上不能放大圆盘。有人预言说,这件事完成时宇宙会在一瞬间闪电式毁灭,也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。...

日期时间格式_日期格式_coderfc的博客-程序员秘密

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d1 = new Date(mStartTime);//可以用空构造方法获取即使时间 String startTime = format.format(d1);

[ABC214F]Substrings_OneInDark的博客-程序员秘密

连 ABC 都要看题解,OneInDark 什么时候可以追上 DD(XYX) 的步伐啊……

iOS的MVC框架之控制层的构建(上)_weixin_33845881的博客-程序员秘密

在我前面的两篇文章里面分别对MVC框架中的M层的定义和构建方法进行了深入的介绍和探讨。这篇文章则是想深入的介绍一下我们应该如何去构建控制层。控制层是联系视图层和模型层的纽带。现在也有非常多的文章宣扬所谓的去控制层或者弱化控制层的作用,觉得这部分是一个鸡肋,他会使得应用变得臃肿不堪。那么他是否有存在的必要呢?一般的应用场景里面,我们都需要将各种界面呈现给用户,然后用户通过某些操作来达到某个目标。从...

Babel详解_蒲公英芽的博客-程序员秘密

什么是BabelBabel 是一个 JavaScript 编译器,是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。用法在这里会介绍如何将用es2015+写的JavaScript代码转换为能在当前浏览器正常执行的代码。包括两方面:语法转换、功能补充(这里暂时叫这个名字,之后会详细...

推荐文章

热门文章

相关标签