jsp中超鏈接路徑的寫法


主題

  超鏈接不就是一個地址字符串嗎?這能有什么花頭? LZSB! 曾經我也是這么想的....

  最近對apache的學習讓我對網頁中超鏈接,CSS,js的路徑的寫法有了一些新的認識.

  所以這篇文章主要分享一下我的一些想法與發現..

 

相對路徑

  最早以前我用的就是相對路徑,剛開始感覺用起來很爽...很簡單...比如當前路徑是localhost:8080/projectName/a.jsp 我想超鏈接到localhost:8080/projectName/b.jsp 我只需要寫<a href="b.jsp">b.jsp</a>就可以了..但是很快我發現了一個問題...如果一個視圖有多個映射地址..比如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 + "/";
%>


<!-- basePath -->
<base href="<%=basePath%>">

2.在每個jsp中要引用其他URL的資源的時候直接<link href="resources/css/index2.css" rel="stylesheet" />

 

解釋和小結:

使用<base>這個標簽以后瀏覽器會把所有相對路徑資源前面拼接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.刪掉<base>標簽

2.每個鏈接從根目錄寫起,用jstl的c標簽,比如<c:url value="/js/jquery.js"/>

 

解釋和小結:

c:url標簽會自動計算出上下文環境...所以<c:url value="/js/jquery.js"/>得到的值是/上下文環境/js/jquery.js

這樣的話即使上下文環境變了,也能得到正確的值.因為得到的值是從根目錄寫起的/開頭的.所以瀏覽器會把這個值拼接在IP:端口后面,所以瀏覽器最終計算得到的jquery.js的值是IP:端口/上下文環境/js/jquery.js

這個值和上述使用絕對路徑得到的值是一樣的,只是使用絕對路徑需要從IP寫起,最終路徑不需要瀏覽器計算,直接就能得到,不依賴於當前瀏覽器地址欄的地址..這里這種相對路徑是從/上下文環境 寫起(上下文環境由c:url計算得出),最終路徑需要瀏覽器拼接IP和端口計算得到,所以依賴於當前瀏覽器地址欄的地址.

所以在反向代理的時候拼接的IP和端口是apache服務器上的地址和端口,然后又會被apache正確ProxyPass到內網tomcat上..

當然,使用base標簽也是可以的,<base href="<c:url value="/" /> ">這樣就不需要在每個URL前面都使用c:url標簽了...

 

總結

就目前我的經驗來看可能使用c:url標簽 寫資源路徑是最佳的方法了...既可以屏蔽上下文變動帶來的URL路徑變化的影響,又可以正確使用反向代理,得到正確的代理路徑...

不過c:url只能在jsp中使用,不知道純html頁面怎么辦...

說不定以后會有其他理解....

轉自:http://www.cnblogs.com/abcwt112/p/5390131.html


免責聲明!

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



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