天天看點

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

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

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

圖一  添加商品界面

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

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

圖二   系統的代碼目錄結構及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檔案夾下

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

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

<span style="font-size:18px;">  <servlet>  

        <servlet-name>AddBookServlet</servlet-name>  

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

  </servlet>  

  <servlet-mapping>  

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

  </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。然後由動作類在進行一些背景操作。

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

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