絕對路徑${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/shiluyong8068/article/details/78730470】的寫法:

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

   如:上面提到的本項目中:<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配置如下:

[html] view plain copy
  1. <span style="font-size:18px;">  <servlet>  
  2.         <servlet-name>AddBookServlet</servlet-name>  
  3.         <servlet-class>com.itheima.web.servlet.AddBookServlet</servlet-class>  
  4.   </servlet>  
  5.     
  6.   <servlet-mapping>  
  7.         <servlet-name>AddBookServlet</servlet-name>  
  8.         <url-pattern>/servlet/addBookServlet</url-pattern>  
  9.   </servlet-mapping></span>  

當點擊了頁面提交表單的命令之後,一個請求發送到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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章