關於pageContext.request.contextPath和request.getContextPath()等路徑問題
${pageContext.request.contextPath}和<%=request.getContextPath()%>等路徑問題
我們在寫jsp頁面的時候,經常見到下面幾個關於路徑的寫法: 比如
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+
request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%
或:
<base href="<%=basePath%>"
還有:
a href="${pageContext.request.contextPath}/static/doem.css
如圖:
實際上,上面這個幾個都是在jsp裡面代表著路徑的寫法,相對路徑,絕對路徑。
聽我一一說來。
1. ${pageContext.request.contextPath}
${pageContext.request.contextPath}
是jsp頁面中取得絕對路徑的方法,等價於
<%=request.getContextPath()%>
二者達到是同樣的效果。
也就是有的人在jsp頂部經常寫: <% String path = request.getContextPath(); %> ,這是取得絕對路。
表示:取出部署的應用程式名 或者 是當前的專案名稱。
舉例:
比如我的專案名稱是demo1。
那麼採用
${pageContext.request.contextPath} 或 <%=request.getContextPath()%> 取出來的就是 /demo1 而"/"代表的含義就是http://localhost:8080 故有時候專案中這樣寫: ${pageContext.request.contextPath}/indx.jsp 或 <%=request.getContextPath()%>/index.jsp , 訪問到的就是 http://localhost:8080/demo1/index.jsp
2.一般頁面頂部都寫:
<%
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
/%>
這個語句是用來拼裝當前網頁的相對路徑的,
request.getSchema() 可以返回當前頁面使用的協議,就是上面例子中的“https”。 request.getServerName() 可以返回當前頁面所在的伺服器的名字,就是上面例子中的“localhost"。 request.getServerPort() 可以返回當前頁面所在的伺服器使用的埠,就是80。 request.getContextPath() 可以返回當前頁面所在的應用的名字,就是上面例子中的demo1。
3.最後:base .... .
<base href="<%=basePath%>">
這個一般和上面的basePath 搭配使用。
一般寫在jsp的title下面,
< base href="…"> 表明當前頁面的相對路徑所使用的根路徑的
demo1 是當前應用程式的名字,
那麼,我的根路徑應該是那麼http://localhost:80/demo1/
當你在頁面上寫了:<base … >以後,我的jsp頁面中凡是內容的連線,url,src,都可以不寫全路徑,只需要寫 authen/login.do 就可以訪問專案對應的url地址。
因為伺服器會自動把<base ...>指定的路徑和頁面內的相對路徑拼裝起來,組成完整路徑。
如果沒有這個<base...>,那麼我頁面的連連結就必須寫全路徑,否則伺服器會找不到。
這也是一些配置了tomcat虛擬路徑以後,上傳圖片。
寫上了慣用${pageContext.request.contextPath}/static/test.jpg 反而訪問不了圖片。
而直接寫static/test.jpg,卻可以看見圖片的原因。
4.補充一下
相對路徑 相對路徑固然比較靈活,但如果想複製頁面內的程式碼卻變得比較困難,因為不同的頁面具有不同的相對路徑,複製後必須修改每一個連線的路徑。如果頁面被多於一個的頁面所包含,那麼被包含頁面中的相對路徑將是不正確的。
絕對路徑 隨著不同的Web應用釋出方式,絕對路徑的值也不同。採用絕對路徑,但為了解決不同部署方式的差別。但是操作不便,其他工具無法正確解釋。