http頁面轉寄和重新導向的區別

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   使用   ar   strong   for   

一、調用方式 


我們知道,在servlet中調用轉寄、重新導向的語句如下:
request.getRequestDispatcher("new.jsp").forward(request, response);//轉寄到new.jsp
response.sendRedirect("new.jsp");//重新導向到new.jsp

在jsp頁面中你也會看到通過下面的方式實現轉寄:
<jsp:forward page="apage.jsp" />

當然也可以在jsp頁面中實現重新導向:
<%response.sendRedirect("new.jsp");//重新導向到new.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應用以外的資源。在重新導向的過程中,傳輸的資訊會被丟失。

例子:


請求轉寄是伺服器內部把對一個request/response的處理權,移交給另外一個 
對於用戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。 傳輸的資訊不會丟失。

 例子: 

解釋三

假設你去辦理某個執照, 

重新導向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然後,你就從A退了出來,自己乘車去了B局。 

轉寄:你先去了A局,A局看了以後,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到後面辦公室聯絡了B的人,讓他們辦好後,送了過來。

 

原文地址: http://blog.csdn.net/meiyalei/article/details/2129120 

 

 

同時附上 Servlet向JSP傳遞值的方法

從Servlet傳值給JSP頁面 

從JSP頁面傳值給Servlet可以使用表單form,由Servlet中用getParamter獲得。如果根據Servlet修改,傳值給JSP頁面,則有兩種方法。

1.在Servlet中 request.getSession.setAttribute("name",value); response.sendRedirect("要跳轉的頁面");同時在JSP頁面中要添加<%=session.getAttribute("name")%>.

 


            

 

2.在Servlet中使用request.setAttribute("name",value);RequestDispatcherrd=request.getRequestDispatcher("跳轉的頁面");rd.forward(request,response);在JSP頁面中也要相應的調整<%=request.getAttribute("name")%>

 

曾經的錯誤:

在Servlet中直接將值通過setAttribute()方法放入Request中,然後在通過response.sendRedict()方法將頁面重新導向目標頁,在目標頁中使用el運算式擷取Request中的值。

結果是得到的是null。

原因:

在Servlet中使用的Request對象是JSP頁面訪問該Servlet時產生的。如果使用頁面重新導向那麼客戶JSP頁面會重新發送HTTP請求,這個Request對象當然也就不存在了。

解決方案:

使用上面提供的兩種方法,一種是使用頁面轉寄,也就是將客戶請求時產生的Request對象的範圍延續到轉寄後的頁面中。另一種是使用session對象,因為在session對象存在於某一使用者的整個會話中,只有關閉瀏覽器該對象才會被釋放。所有通過Request.getSession()方法獲得session,然後將值放進session中也可以。

 

http頁面轉寄和重新導向的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.