1. 程式人生 > >${pageContext.request.contextPath}和<%=request.getContextPath()%>

${pageContext.request.contextPath}和<%=request.getContextPath()%>

href mvc 比較 ext ref 名稱 說了 tails 物理地址

轉自:http://blog.csdn.net/u010010428/article/details/51246491

做的一個web項目,需要在jsp頁面中獲取js、css和圖片等資源,本想采用相對路徑來寫,但是發現可移植性太差,在自己電腦上還好使,但辛辛苦苦調好代碼後,放到其他電腦上又得再次辛辛苦苦修改相關路徑。於是決定采用絕對路徑來寫。然後在網上找尋相關方法,發現用的比較多的兩個:${pageContext.request.contextPath}和<%=request.getContextPath()%>,但具體用哪個我也不大清楚,於是繼續查找兩者的區別,但讓我郁悶的是,網上“抄襲”的真多啊!而且說了一大堆!盡是些不痛不癢的專業名詞,關鍵的真沒幾個!所以我決定靠自己理解,現在明白了!我想用一種比較通俗的語言分享一下我對此的認識!

可以說${pageContext.request.contextPath}等價於<%=request.getContextPath()%>!它們的意思就是取得當前項目名稱(或者是--取出部署的應用程序名,不過這麽說太官方了,試問有多少人知道“取出部署的應用程序名”的義)
那麽什麽是當前的項目名稱呢?

技術分享圖片

假定你的web應用名稱為hotel,這個hotel就是當前的項目名稱,不過你在瀏覽器中輸入請求路徑時,例如輸入http//:localhost:8080/hotel/login.jsp

${pageContext.request.contextPath}或<%=request.getContextPath()%>就是從這個請求路徑(URL)上截取(是截取) /hotel ,看清楚,前面是有"/",而這個“/”代表的是"http//:localhost:8080",看清楚這裏是沒有"/"的!

對應到真是的物理地址,即為圖中WebContent目錄!

另外,如果你是在Tomcat的server.xml文件中配置了虛擬目錄,例如

技術分享圖片

那麽我們在對應的物理目錄F:\javaweb中創建test_jsp.jsp文件,內容為

技術分享圖片

開啟Tomcat,進行測試,發現輸出結果為

技術分享圖片

可以看到,此時輸出為虛擬目錄,並且二者完全等價!

因此,在表單<formaction="${pageContext.request.contextPath}/hotel/login.jsp">中,這樣寫路徑永遠對,翻譯過來${pageContext.request.contextPath}/hotel/login.jsp其中的含義,就是http//:localhost:8080/hotel/login.jsp,相當於你寫了一全路徑!當然前提是你的JSP頁面等等必須放置的位置正確才可以,所以才說明路徑永遠正確。

為什麽這麽要做呢?因為學過一些MVC模式的程序員都知道,JSP的作用是用來顯示的(表現的),其他的作用最好不要在這個頁面上顯示,尤其是Java代碼!所以就用EL表達式來替代類似有“<%%>”這樣的代碼格式。

${pageContext.request.contextPath}和<%=request.getContextPath()%>