在javaweb開發(fā)中,經(jīng)常在寫URL的時(shí)候會(huì)弄混或者寫錯(cuò),因此下面就進(jìn)行一個(gè)總結(jié):只要是寫URL地址,那么建議最好以"/"開頭,也就是使用絕對(duì)路徑的方式,那么這個(gè)"/"到底代表什么呢?可以用如下的方式來記憶"/":如果"/"是給服務(wù)器用的,則代表當(dāng)前的web工程,如果"/"是給瀏覽器用的,則代表webapps目錄。
1.1 "/"代表當(dāng)前web工程的常見應(yīng)用場(chǎng)景
- ServletContext.getRealPath(String path)獲取資源的絕對(duì)路徑
/**
* 1.ServletContext.getRealPath("/download/1.JPG")是用來獲取服務(wù)器上的某個(gè)資源,
* 那么這個(gè)"/"就是給服務(wù)器用的,"/"此時(shí)代表的就是web工程
* ServletContext.getRealPath("/download/1.JPG")表示的就是讀取web工程下的download文件夾中的1.JPG這個(gè)資源
* 只要明白了"/"代表的具體含義,就可以很快寫出要訪問的web資源的絕對(duì)路徑
*/
this.getServletContext().getRealPath("/download/1.JPG");
- 在服務(wù)器端forward到其他頁面
/**
* 客戶端請(qǐng)求某個(gè)web資源,服務(wù)器跳轉(zhuǎn)到另外一個(gè)web資源,這個(gè) forward也是給服務(wù)器用的,
* 那么這個(gè)"/"就是給服務(wù)器用的,所以此時(shí)"/"代表的就是web工程
*/
this.getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
1.2 "/"代表webapps目錄的常見應(yīng)用場(chǎng)景
- 使用sendRedirect實(shí)現(xiàn)請(qǐng)求重定向
response.sendRedirect("/JavaWeb_Response_Study_20180405/index.jsp");
服務(wù)器發(fā)送一個(gè)URL地址給瀏覽器,瀏覽器拿到URL地址之后,再去請(qǐng)求服務(wù)器,所以這個(gè)"/"是給瀏覽器使用的,此時(shí)"/"代表的就是webapps目錄,"/JavaWeb_Response_Study_20180405/index.jsp"這個(gè)地址指的就是"webapps\JavaWeb_Response_Study_20180405\index.jsp"
response.sendRedirect("/項(xiàng)目名稱/文件夾目錄/頁面");這種寫法是將項(xiàng)目名稱寫死在程序中的做法,不靈活,萬一哪天項(xiàng)目名稱變了,此時(shí)就得改程序,所以推薦使用下面的靈活寫法:
response.sendRedirect(request.getContextPath()+"/index.jsp");
request.getContextPath()獲取到的內(nèi)容就是"/JavaWeb_Response_Study_20180405",這樣就比較靈活了,使用request.getContextPath()代替"/項(xiàng)目名稱",推薦使用這種方式,靈活方便!
-
使用超鏈接跳轉(zhuǎn)
<a href="/JavaWeb_Response_Study_20180405/index.jsp">跳轉(zhuǎn)到首頁</a>
這是客戶端瀏覽器使用的超鏈接跳轉(zhuǎn),這個(gè)"/"是給瀏覽器使用的,此時(shí)"/"代表的就是webapps目錄。
使用超鏈接訪問web資源,絕對(duì)路徑的寫法推薦使用下面的寫法改進(jìn):
<a href="${pageContext.request.contextPath}/index.jsp">跳轉(zhuǎn)到首頁</a>
這樣就可以避免在路徑中出現(xiàn)項(xiàng)目的名稱,使用 ${pageContext.request.contextPath}取代"/JavaWeb_Response_Study_20180405"
getOutputStream和getWriter方法分別用于得到輸出二進(jìn)制數(shù)據(jù)、輸出文本數(shù)據(jù)的ServletOuputStream、Printwriter對(duì)象。
getOutputStream和getWriter這兩個(gè)方法互相排斥,調(diào)用了其中的任何一個(gè)方法后,就不能再調(diào)用另一方法。
Servlet程序向ServletOutputStream或PrintWriter對(duì)象中寫入的數(shù)據(jù)將被Servlet引擎從response里面獲取,Servlet引擎將這些數(shù)據(jù)當(dāng)作響應(yīng)消息的正文,然后再與響應(yīng)狀態(tài)行和各響應(yīng)頭組合后輸出到客戶端。
Serlvet的service方法結(jié)束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對(duì)象是否已經(jīng)調(diào)用過close方法,如果沒有,Servlet引擎將調(diào)用close方法關(guān)閉該輸出流對(duì)象。