以系統的一個“添加商品”的功能為例加以說明,系統頁面為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檔案夾下
①完全比對:以“/”開頭,以字母(非“*”)結束
如:上面提到的本項目中:<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。然後由動作類在進行一些背景操作。
圖三 url-pattern--->servlet-name--->servlet-class