在javaweb開(kāi)發(fā)中破喻,經(jīng)常在寫(xiě)URL的時(shí)候會(huì)弄混或者寫(xiě)錯(cuò)职祷,因此下面就進(jìn)行一個(gè)總結(jié):只要是寫(xiě)URL地址,那么建議最好以"/"開(kāi)頭蚁鳖,也就是使用絕對(duì)路徑的方式磺芭,那么這個(gè)"/"到底代表什么呢?可以用如下的方式來(lái)記憶"/":如果"/"是給服務(wù)器用的醉箕,則代表當(dāng)前的web工程钾腺,如果"/"是給瀏覽器用的,則代表webapps目錄讥裤。
1.1 "/"代表當(dāng)前web工程的常見(jiàn)應(yīng)用場(chǎng)景
- ServletContext.getRealPath(String path)獲取資源的絕對(duì)路徑
/**
* 1.ServletContext.getRealPath("/download/1.JPG")是用來(lái)獲取服務(wù)器上的某個(gè)資源放棒,
* 那么這個(gè)"/"就是給服務(wù)器用的,"/"此時(shí)代表的就是web工程
* ServletContext.getRealPath("/download/1.JPG")表示的就是讀取web工程下的download文件夾中的1.JPG這個(gè)資源
* 只要明白了"/"代表的具體含義己英,就可以很快寫(xiě)出要訪問(wèn)的web資源的絕對(duì)路徑
*/
this.getServletContext().getRealPath("/download/1.JPG");
- 在服務(wù)器端forward到其他頁(yè)面
/**
* 客戶端請(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目錄的常見(jiàn)應(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)目名稱/文件夾目錄/頁(yè)面");這種寫(xiě)法是將項(xiàng)目名稱寫(xiě)死在程序中的做法见坑,不靈活嚷掠,萬(wàn)一哪天項(xiàng)目名稱變了,此時(shí)就得改程序荞驴,所以推薦使用下面的靈活寫(xiě)法:
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)到首頁(yè)</a>
這是客戶端瀏覽器使用的超鏈接跳轉(zhuǎn)孙蒙,這個(gè)"/"是給瀏覽器使用的项棠,此時(shí)"/"代表的就是webapps目錄。
使用超鏈接訪問(wèn)web資源挎峦,絕對(duì)路徑的寫(xiě)法推薦使用下面的寫(xiě)法改進(jìn):
<a href="${pageContext.request.contextPath}/index.jsp">跳轉(zhuǎn)到首頁(yè)</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ì)象中寫(xiě)入的數(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)用過(guò)close方法幔翰,如果沒(méi)有漩氨,Servlet引擎將調(diào)用close方法關(guān)閉該輸出流對(duì)象。