關於javaweb中的絕對路徑和相對路徑(關於引用外部資源時的路徑問題)
阿新 • • 發佈:2018-11-23
相信大家在寫web專案時,對於外間資源的引用多多少少都會用到,而此時引用的路徑就顯得十分重要!(在跳轉或者其它請求後頁面樣式得丟失便就是路徑得問題)
在開始之前大家需要明白一點就是web專案建立的時候會有一個Web-Content,但是在專案釋出後這個就不存在了,所以再訪問的時候路徑不許要考慮Web-Content
關於路徑得解釋:
關於絕地路徑相信大家都會,我這裡就說一下概念:
絕對路徑:不可改變的路徑
本地絕對路徑:增加碟符的路徑(e:/test/css01.css)(在引入時,直接找自己得電腦碟符中得指定位置,但是一般都不會使用)
網路絕對路徑:增加協議,IP地址,埠號的路徑(http://localhost:8080/css01.css)
說明在你當前專案根路徑下建立一個css01.css檔案(就是右擊Web-Content專案名建立檔案,為什麼不是右擊專案名,是因為,當專案釋出後,是沒有Web-Content這個目錄的)
我相信大家都在找關於相對路徑,所以我這裡先說明一下概念,在用實際專案闡述(專案很簡單)
概念:
相對路徑:可以改變的路徑,但是以基準路徑為參考,查詢其他路徑
預設情況下,相對路徑的基準路徑是以當前資源的訪問路徑為基準(重點)
說明準備:
我先建立一個簡單web專案,層次如下圖
AServlet是一個跳轉頁面,跳轉到/WEB-INF/jsps/jsp01.jsp(訪問得路徑就是/AServlet)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
request.getRequestDispatcher("/WEB-INF/jsps/jsp01.jsp").forward(request, response);
}
css01.css頁面樣式:
#btn1{
color: red;
}
js01.js頁面
function testBtn() {
alert("enter")
};
jsp01.jsp頁面
<button id="btn1" onclick="testBtn()" >test</button>
好接下來就是重頭戲:在jsp01.jsp頁面引入css01.css和js01.js(請參考上面得專案目錄結構層次)
(1)在jsp01.jsp頁面中加上這兩句引用(../表示上一層目錄)
<link rel="stylesheet" type="text/css" href="../../css/css01.css">
<script type="text/javascript" src="../../js/js01.js"></script>
錯誤思想: |
按照上面得寫法一個(../)就是到了WEB-INF目錄下,再來一個(../)就到了專案根目錄(Testpath)(不是Web-Content目錄嗎??是因為,當專案釋出後,是沒有Web-Content這個目錄的,前面我說過了!!),那此時正好啊,根目錄再加上直接寫的那個目錄,對啊,莫得問題啊!!我只能說小夥子還是年輕!!(hh) |
正確思想: |
這是的路徑確實是相對路徑,不過相對的位置大家弄錯了,此時相對的是當前的訪問路徑,此時的訪問路徑是http://localhost:8080/TestPath/AServlet(因為我這裡使用的是轉發,如果是重定向以重定向到該頁面後的網頁路徑為準!!不過大家注意WEB-INF下的資源是不可以被直接訪問的!因此使用重定向好像會出現一些問題,大家可以先使用轉發參考本片文章)基礎路徑就是http://localhost:8080/TestPath/(/AServlet去掉,以後都是的去掉最後一個)即此時使用的兩個(../)後路徑就會變成http://localhost:8080/,雖然使用了兩個(../)但是效果只是一個,因為只能上一個目錄了,在前面就是網路路徑的根路徑,無法更改!!最總的路徑就變成了http://localhost:8080/css/css01.css(這樣訪問的路徑肯定會出錯!) |
解決: |
所以你需要將兩個(../)都去掉!!這樣就變為基礎路徑加上自己寫的路徑 http://localhost:8080/TestPath/css/css01.csshttp://localhost:8080/TestPath/js/js01.js(關於在css/css01.css與js/js01.js前加不加 / 的問題我下面會說到)這樣路徑就對了!!頁面的css格式與js指令碼也可以使用了!!(效果我就不展示了!!) |
但是大家也看到了,這樣去寫不是很好,因為,一個大的專案檔案會很多,樣式以及檔案的位置都會很多,你在這個jsp01.jsp頁面這樣寫,其它的頁面其它資料夾下,又是另一種相對路徑,非常的麻煩!!
所以大家可以把css與js的樣式檔案路徑寫完整(其它資原始檔同理)
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/css/css01.css">
<script type="text/javascript" src="${pageContext.request.contextPath }/js/js01.js"></script>
對就是使用EL表示式,${pageContext.request.contextPath }表示當前的專案名,如果還是覺得這樣不好,大家可以給${pageContext.request.contextPath }器一個別名,以後使用該別名即可
例如:寫一個Listener去繼承ServletContextListener,實現相應的方法,將專案名獲取後儲存到application域即可,以後,所有的頁面都可以使用別名(具體的實現我就不說了,文章重點不再這裡,感興趣的可以去上網查詢,或者直接慢慢寫!)
路徑以斜槓開頭,表示的特殊的相對路徑,在不同的場景中,相對的位置會發生變化。
url : http://localhost:8080/TestPath/css/css01.css
前臺路徑:<a href=”/css/css01.css”><img src=”/css/css01.css”>(由瀏覽器解析的)
相對伺服器的根 : http://localhost:8080/
即最後的路徑就是: http://localhost:8080/css/css01.css(所以之前的那個地方是不能加 / 的)
後臺路徑:forward(”/user.jsp”), xml(由伺服器解析的)
相對web應用的根:http://localhost:8080/TestPath/
最後的路徑:http://localhost:8080/TestPath/user.jsp