1. 程式人生 > >絕對路徑${pageContext.request.contextPath}用法及其與web.xml中Servlet的url-pattern匹配過程

絕對路徑${pageContext.request.contextPath}用法及其與web.xml中Servlet的url-pattern匹配過程

以系統的一個“新增商品”的功能為例加以說明,系統頁面為add.jsp,如圖一所示:

圖一  新增商品介面

系統的程式碼目錄結構及add.jsp程式碼如圖二所示:

圖二   系統的程式碼目錄結構及add.jsp程式碼

${pageContext.request.contextPath}用於解決使用相對路徑時出現的問題,它的作用是取出所部署專案的名字。

對於圖片檔案,如圖二所示“${pageContext.request.contextPath}/bookcover/101.jpg”使用的是絕對路徑,${pageContext.request.contextPath}返回的是”/test”【注意:很多地方寫的返回值是“test/”,這是不對的】,拼接之後路徑就變成:“/test/bookcover/101.jpg”。如果使用相對路徑則為:“../../bookcover/101.jpg”(相對於add.jsp頁面)。其他的CSS檔案、Js檔案、Jsp檔案與圖片檔案相似,使用方法一樣。

在JavaWeb專案中,Jsp頁面的form表單的action屬性也常常會使用${pageContext.request.contextPath}來表示請求路徑。如圖二中【沒有使用框架】的form表單的action屬性為:action="${pageContext.request.contextPath }/servlet/addBookServlet"。要理解這個請求地址,必須先了解web.xml【注意:web.xml必須放在WEB-INF資料夾下,原因見部落格:http://blog.csdn.net/sun9528/article/details/72423112】的寫法:

①完全匹配:以“/”開頭,以字母(非“*”)結束

   如:上面提到的本專案中:<url-pattern>/servlet/addBookServlet</url-pattern>

②目錄匹配:以“/”開頭且以“/*”結尾

   如:<url-pattern>/test/*</url-pattern>

   <url-pattern>/*</url-pattern>

③副檔名匹配:以“*.”開頭,以副檔名結束

   如:<url-pattern>*.do</url-pattern>

④“/”用來表明對應的Servlet為應用預設的Servlet。在這種情況下Servlet路徑是請求的URI去掉上下文路徑並且路徑資訊為null。

本專案中“商品新增”功能的web.xml配置如下:

  1. <servlet>

  2. <servlet-name>AddBookServlet</servlet-name>

  3. <servlet-class>com.itheima.web.servlet.AddBookServlet</servlet-class>

  4. </servlet>

  5. <servlet-mapping>

  6. <servlet-name>AddBookServlet</servlet-name>

  7. <url-pattern>/servlet/addBookServlet</url-pattern>

  8. </servlet-mapping>

當點選了頁面提交表單的命令之後,一個請求傳送到servlet容器,servlet容器先會將請求的url減去當前應用上下文的路徑作為servlet的對映url。訪問的是http://localhost:8080/test/servlet/addBookServlet,我的應用上下文是test,容器會將http://localhost:8080/test去掉,剩下的/servlet/addBookServlet部分拿來做servlet的對映匹配。很明顯可以通過圖三的形式在web.xml中找到請求的動作類(url-pattern--->servlet-name--->servlet-class)。動作類為:com.itheima.web.servlet.AddBookServlet。然後由動作類在進行一些後臺操作。

圖三 url-pattern--->servlet-name--->servlet-class