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

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

       做的一個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表示式來替代類似有“<%%>”這樣的程式碼格式。