浅析请求转发和重定向
淺析請求轉(zhuǎn)發(fā)和重定向
1.請求轉(zhuǎn)發(fā)
request.getRequestDispather("/indexServlet").forword(request,response);
請求轉(zhuǎn)發(fā):不會修改地址欄路徑。
因為請求轉(zhuǎn)發(fā)時,還未產(chǎn)生響應(yīng),request對象還未銷毀,所以可以使用request
作用域
訪問受保護(hù)目錄下的資源
requestDispatcher:是服務(wù)器的資源封裝器,可以封裝服務(wù)器內(nèi)部所有資源。
(包括WEB-INF下資源)
WEB-INF是受保護(hù)目錄,不能夠通過瀏覽器直接訪問
可以通過請求轉(zhuǎn)發(fā)去訪問
request.getRequestDispather("/WEB-INF/index.HTML").forward(request,response);
?
2.重定向
重定向嚴(yán)重依賴瀏覽器,路徑是客戶端路徑。
response.setStatus(302); response.setHeader("Location","路徑");-
l 瀏覽器立即重定向:response.sendRedirect("客戶端絕對路徑");
-
l 瀏覽器延遲X秒重定向:response.setHeader("refresh","X秒;url=客戶端絕對路徑");
* 請求轉(zhuǎn)發(fā)和請求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet"); ?使用request獲取RequestDispatcher對象,方法的參數(shù)是被轉(zhuǎn)發(fā)或包含的Servlet的Servlet路徑
請求轉(zhuǎn)發(fā):*****rd.forward(request,response);
請求包含:rd.include(request,response);有時一個請求需要多個Servlet協(xié)作才能完成,所以需要在一個Servlet跳到另一個Servlet!
> 一個請求跨多個Servlet,需要使用轉(zhuǎn)發(fā)和包含。
> 請求轉(zhuǎn)發(fā):由下一個Servlet完成響應(yīng)體!當(dāng)前Servlet可以設(shè)置響應(yīng)頭!(留頭不留體)
> 請求包含:由兩個Servlet共同完成響應(yīng)體!(都留)
> 無論是請求轉(zhuǎn)發(fā)還是請求包含,都在一個請求范圍內(nèi)!使用同一個request和response!
* request域
Servlet中三大域?qū)ο?#xff1a;request、session、application,都有如下三個方法:
> void setAttribute(String name, Object value)
> Object getAttribute(String name)
?? ?> void removeAttribute(String name);
> 同一請求范圍內(nèi)使用request.setAttribute()、request.getAttribute()來傳值!前一個Servlet調(diào)用setAttribute()保存值,后一個Servlet調(diào)用getAttribute()獲取值。* 請求轉(zhuǎn)發(fā)和重定向的區(qū)別
> 請求轉(zhuǎn)發(fā)是一個請求一次響應(yīng),而重定向是兩次請求兩次響應(yīng)
> 請求轉(zhuǎn)發(fā)地址欄不變化,而重定向會顯示后一個請求的地址
> 請求轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)到本項目其他Servlet,而重定向不只能重定向到本項目的其他Servlet,還能定向到其他項目
> 請求轉(zhuǎn)發(fā)是服務(wù)器端行為,只需給出轉(zhuǎn)發(fā)的Servlet路徑,而重定向需要給出requestURI,即包含項目名!
> 請求轉(zhuǎn)發(fā)和重定向效率是轉(zhuǎn)發(fā)高!因為是一個請求!
<> 需要地址欄發(fā)生變化,那么必須使用重定向!
<> 需要在下一個Servlet中獲取request域中的數(shù)據(jù),必須要使用轉(zhuǎn)發(fā)!
總結(jié)
以上是生活随笔為你收集整理的浅析请求转发和重定向的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用eclipse开发javaweb登录
- 下一篇: 浅析cookie以及一些小案例