示例:
//獲取username信息
String username=request.getParameter("username");
//轉發與重定向
if(username.equals("admin")){
//提示用戶已存在,不能注冊
request.setAttribute("message","該用戶已存在,不能注冊");//添加提示信息,需要在userCreate.jsp頁面中進行提示信息展示
request.getRequestDispatcher("userCreate.jsp").forward(request, response);//轉法
}else{
//提示注冊成功
request.setAttribute("message","注冊成功");
response.sendRedirect("indext.jsp");//重定向
}
轉發與重定向的區別:
二、本質區別
解釋一
一句話,轉發是服務器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個動作的工作流程:
轉發過程:客戶瀏覽器發送http請求——》web服務器接受此請求——》調用內部的一個方法在容器內部完成請求處理和轉發動作——》將目標
資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。
在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
重定向過程:客戶瀏覽器發送http請求——》web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,
則自動再發送一個新的http請求,請求url是新的location地址——》服務器根據此請求尋找資源並發送給客戶。在這里location可以重定向到任意URL,
既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。
重定向行為是瀏覽器做了至少兩次的訪問請求的。
解釋二
重定向,其實是兩次request
第一次,客戶端request?? A,服務器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。
重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的信息會被丟失。
例子:
response.sendRedirect("loginsuccess.jsp");
請求轉發是服務器內部把對一個request/response的處理權,移交給另外一個
對於客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。傳輸的信息不會丟失。
例子:
RequestDispatcher dis=request.getRequestDispatcher(“loginsuccess.jsp”);
dis.forward(request,response);
解釋三
假設你去辦理某個執照
重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然后,你就從A退了出來,自己乘車去了B局。
轉發:你先去了A局,A局看了以后,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己
到后面辦公室聯系了B的人,讓他們辦好后,送了過來。
最后在來一個書面解釋加深印象:
1.重定向的執行過程:Web服務器向瀏覽器發送一個http響應--》瀏覽器接受此響應后再發送一個新的http請求到服務器--》
服務器根據此請求尋找資源並發送給瀏覽器。它可以重定向到任意URL,不能共享request范圍內的數據。
2.重定向是在客戶端發揮作用,通過新的地址實現頁面轉向。
3.重定向是通過瀏覽器重新請求地址,在地址欄中可以顯示轉向后的地址。
4.轉發過程:Web服務器調用內部方法在容器內部完成請求和轉發動作--》將目標資源發送給瀏覽器,它只能在同一個Web應用中
使用,可以共享request范圍內的數據。
5.轉發是在服務器端發揮作用,通過forward()方法將提交信息在多個頁面間進行傳遞。
6.轉發是在服務器內部控制權的轉移,客戶端瀏覽器的地址欄不會顯示出轉向后的地址。