1. 程式人生 > 其它 >關於${pageContext.request.contextPath}的理解

關於${pageContext.request.contextPath}的理解

關於${pageContext.request.contextPath}的理解

${pageContext.request.contextPath}是JSP取得絕對路徑的方法,等價於<%=request.getContextPath()%>。

也就是取出部署的應用程式名或者是當前的專案名稱

比如我的專案名稱是demo1在瀏覽器中輸入為http://localhost:8080/demo1/a.jsp ${pageContext.request.contextPath}或<%=request.getContextPath()%>取出來的就是/demo1,而"/"代表的含義就是http://localhost:8080

故有時候專案中這樣寫${pageContext.request.contextPath}/a.jsp

  • 絕對路徑與相對路徑的比較


    1)採用相對路徑遇到的問題

    相對路徑固然比較靈活,但如果想複製頁面內的程式碼卻變得比較困難,因為不同的頁面具有不同的相對路徑,複製後必須修改每一個連線的路徑。
    如果頁面被多於一個的頁面所包含,那麼被包含頁面中的相對路徑將是不正確的。
    如果採用Struts的Action返回頁面,那麼由於頁面路徑與 Action路徑不同,使得瀏覽器無法正確解釋頁面中的路徑,如頁面為/pages/cust/cust.jsp,圖片所有目錄為/images /title.gif,這時在/pages/cust/cust.jsp中的所用的路徑為”http://images.cnblogs.com /title.gif”,但是如果某一個Action的Forward指向這個JSP檔案,而這個Action的路徑為/cust/manage.do, 那麼頁面內容中”http://images.cnblogs.com/title.gif”就不再指向正確的路徑了。
    解決以上問題似乎只有使用絕對路徑了。

    2)採用絕對路徑遇到的問題

    隨 著不同的Web應用釋出方式,絕對路徑的值也不同。如Web應用釋出為MyApp,則路徑”/MyApp/images/title.gif”是正確的, 但釋出為另一應用時如MyApp2,這個路徑就不對了,也許這個情況比較少,但以default方式釋出Web應用時以上絕對路徑也不 同:”/images/title.gif”。

    二.解決方案

    1)採用絕對路徑,但為了解決不同部署方式的差別,在所有非struts標籤的路徑前加${pageContext.request.contextPath},如原路徑為:
    ”/images/title.gif”,改為
    “${pageContext.request.contextPath}/images/title.gif”。
    程式碼” ${pageContext.request.contextPath}”的作用是取出部署的應用程式名,這樣不管如何部署,所用路徑都是正確的。 缺點:
    操作不便,其他工具無法正確解釋${pageContext.request.contextPath}
    2) 採用相對路徑,在每個JSP檔案中加入base標籤,如:
    <base href="http://${header['host']}${pageContext.request.contextPath}/pages/cust/relation.jsp" />
    這樣所有的路徑都可以使用相對路徑。
    缺點:
    對於被包含的檔案依然無效。
    真正使用時需要靈活應用1)和2),寫出更加健壯的程式碼。

    在使用的時候可以使 用${pageContext.request.contextPath},也同時可以使 用<%=request.getContextPath()%>達到同樣的效果,同時,也可以 將${pageContext.request.contextPath},放入一個JSP檔案中,將用C:set放入一個變數中,然後在用的時候用EL 表示式取出來。

    [java]
    view plaincopyprint?
    1. </pre><prename="code"class="html"><c:setvar="ctx"value="${pageContext.request.contextPath}"/>
內容僅供個人學習、記錄使用,侵刪