以系統的一個“添加商品”的功能爲例加以說明,系統頁面爲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配置如下:
- <span style="font-size:18px;"> <servlet>
- <servlet-name>AddBookServlet</servlet-name>
- <servlet-class>com.itheima.web.servlet.AddBookServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>AddBookServlet</servlet-name>
- <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