相對路徑和絕對路徑的區別,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("/");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM