最近對apache的學習讓我對網頁中超連結,css,js的路徑的寫法有了一些新的認識.
所以這篇文章主要分享一下我的一些想法與發現..
最早以前我用的就是相對路徑,剛開始感覺用起來很爽...很簡單...比如當前路徑是localhost:8080/projectname/a.jsp 我想超連結到localhost:8080/projectname/b.jsp 我只需要寫b.jsp就可以了..但是很快我發現了乙個問題...如果乙個檢視有多個對映位址..比如localhost:8080/projectname/a.jsp 和 localhost:8080/projectname/path1/path2 對映到的是同乙個jsp...那裡面的超連結是肯定會有問題的.
因為路徑層次都變了...這種情況是可能會發生的,因為會有伺服器跳轉的存在,所以乙個view可能會對應n個url..而每個url不同,根據相對路徑去找資源,拼接得到資源的url是肯定不同的..所以這個方法並不好,除非保證乙個view只對應乙個url.
因為相對路徑不太好,所以我開始使用絕對路徑...使用絕對路徑可以避免上述相對路徑遇到的問題..
我一般是這麼使用的...
1.先寫乙個每個頁面head裡都會匯入的jsp.在這個jsp裡面:
<%string
path
=request.getcontextpath();
string
basepath
=request.getscheme() +"
://"
+request.getservername() +"
:"+request.getserverport()
+path +"
/";%>
<
base
href
="<%=basepath%>"
>
2.在每個jsp中要引用其他url的資源的時候直接
解釋和小結:
使用這個標籤以後瀏覽器會把所有相對路徑資源前面拼接base標籤裡面的href值得到完整的url路徑.不寫這個標籤直接使用相對路徑的時候相當於base的href就是當前url的上一級.
像我這樣寫以後index2.css的完整url就是 ip:埠/上下文/resources/css/index2.css
上下文就是專案部署的上下文環境的值,可以在tomcat的server.xml裡面context節點裡的path裡去設定..
開發的時候eclipse部署到tomcat預設上下文環境的值是專案名稱.所以專案首頁是localhost:8080/專案名稱
而專案上線以後直接對映到網域名稱,比如www.test.com那這個上下文環境的值是/
雖然上下文環境變了.但是通過<%=basepath%>可以過濾掉這個細節,保證資源的url是從ip寫起的,一定找得到這個資源..
絕對路徑的方法我一直用了好久,覺得還是蠻好用的,無論環境怎麼變,鏈結url都不用變..直到我學習了apache的反向**...
使用絕對路徑的問題在於如果使用了反向**,比如把www.a.com proxypass到了內網ip192.168.x.x...因為apache只是乙個空殼,專案並沒有部署在apache上.真正的專案部署在192.168.x.x那台tomcat上,所以專案裡的jsp裡的basepath計算出來的href是192.168.x.x:埠/上下文,而不是www.a.com
這個時候如果你點了www.a.com對應的jsp上面的超連結的話,會跳轉到192.168.x.x:埠/上下文/超連結相對路徑...就是說瀏覽器位址列從www.a.com變成了192.168.x.x/....
這樣的話相當於apache的反向**是沒法發揮作用的,因為你的資源寫的是絕對路徑...apache並不知道這個位址是需要**的...它也沒有辦法去管理,因為它不會去搜尋你返回的html並把連線乙個乙個替換掉..
這個時候仍然需要使用相對路徑,但是我們可以從根位址寫起...
具體做法:
1.刪掉標籤
2.每個鏈結從根目錄寫起,用jstl的c標籤,比如
解釋和小結:
c:url標籤會自動計算出上下文環境...所以得到的值是/上下文環境/js/jquery.js
這樣的話即使上下文環境變了,也能得到正確的值.因為得到的值是從根目錄寫起的/開頭的.所以瀏覽器會把這個值拼接在ip:埠後面,所以瀏覽器最終計算得到的jquery.js的值是ip:埠/上下文環境/js/jquery.js
這個值和上述使用絕對路徑得到的值是一樣的,只是使用絕對路徑需要從ip寫起,最終路徑不需要瀏覽器計算,直接就能得到,不依賴於當前瀏覽器位址列的位址..這裡這種相對路徑是從/上下文環境 寫起(上下文環境由c:url計算得出),最終路徑需要瀏覽器拼接ip和埠計算得到,所以依賴於當前瀏覽器位址列的位址.
所以在反向**的時候拼接的ip和埠是apache伺服器上的位址和埠,然後又會被apache正確proxypass到內網tomcat上..
當然,使用base標籤也是可以的,">這樣就不需要在每個url前面都使用c:url標籤了...
就目前我的經驗來看可能使用c:url標籤 寫資源路徑是最佳的方法了...既可以遮蔽上下文變動帶來的url路徑變化的影響,又可以正確使用反向**,得到正確的**路徑...
不過c:url只能在jsp中使用,不知道純html頁面怎麼辦...
說不定以後會有其他理解....
HTML 超連結的路徑及建立超連結
超連結有兩個路徑,分別是絕對路徑和相對路徑。1.1絕對路徑 絕對路徑指從根目錄開始查詢一直到檔案所處位置所經過的所有目錄,目錄名之間用反斜槓 隔開。比如存在電腦c盤的乙個檔案的絕對路徑是從碟符開始的然後途經找到該檔案的所有目錄。1.2相對路徑 相對路徑指相對於自己的目標檔案位置。比如乙個專案中存在a...
超連結和路徑
超連結和路徑 1 標籤 2 屬性 href 必須 target 可選 target 告訴瀏覽器希望將所連線的資源顯示在 blank 在新視窗或者標籤頁中開啟文件。parent 在父窗框組 frameset 中開啟文件。self 在當前視窗開啟文件 預設 top 在頂層視窗中開啟文件。h5中,框架基本...
wml中的超連結
連線是 html 頁面裡最基本的功能,在 wml 裡也一樣用 l title label 和 來包括用來建立連線的文字,必選屬性href指定了要開啟的 url,可選的title屬性給該連線取個標記名字,這個名字將作為軟按鈕之一的accept鍵 詳見以前的hdml入門文章 的標記顯示在螢幕的軟按鈕區,...