jsp重定向和轉發

表單提交到servlet後,servlet進行轉發以後瀏覽器上的url爲何仍是servlet的url-pattern,可是頁面內容倒是跳轉以後頁面的內容。這個其實和轉發和重定向有關係。html

當使用轉發方法的時候,前臺提交的表單的內容在servlet中利用request對象能夠獲取到,而跳轉到result.jsp以後,在result。jsp中用request也能獲取到提交的內容。這裏瀏覽器的地址是servlet的映射地址。web

   

 

而使用重定向方法的時候,前臺提交的表單內容在servlet中能夠獲取,可是在result.jsp頁面中卻獲取不了。這裏瀏覽器的地址是目標頁面的url。瀏覽器

  

 

一、請求轉發(RequestDispatcher)的過程:
         客戶首先發送一個請求到服務器端,服務器端發現匹配的servlet,並指定它去執行,當這個servlet執行完以後,它要調用 getRequestDispacther()方法,把請求轉發給指定的result.jsp,整個流程都是在服務器端完成的,並且是在同一個請求裏面完成的,所以servlet和jsp共享的是同一個request對象,在servlet裏面放的全部東西,在jsp中都能取出來,所以,jsp能把結果經過getAttribute()方法獲取,getAttribute()執行完把結果返回給客戶端。整個過程是一個請求,一個響應。
 
二、重定向(sendRedirect)的工做原理:
           客戶發送一個請求到服務器,服務器匹配servlet,這都和請求轉發同樣,servlet處理完以後調用了sendRedirect()這個方法,這個方法是response的方法,因此,當這個servlet處理完以後,執行到response.senRedirect()方法,當即向客戶端返回這個響應,告訴客戶端你必需要再發送一個請求,去訪問result.jsp,緊接着客戶端受到這個請求後,馬上發出一個新的請求,去請求result.jsp, 這裏兩個請求互不干擾,相互獨立,在前面request裏面setAttribute()的任何東西,在後面的request裏面都得到不了。可見,在 sendRedirect()裏面是兩個請求,兩個響應。
 

3.轉發是服務器行爲,重定向是客戶端行爲。服務器

轉發過程:客戶瀏覽器發送http請求----》web服務器接受此請求--》調用內 部的一個方法在容器內部完成請求處理和轉發動做----》將目標資源發送給客戶;在這裏,轉發的路徑必須是同一個web容器下的url,其不能轉向到其餘 的web路徑上去,中間傳遞的是本身的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感受不到服務器作了轉 發的。轉發行爲是瀏覽器只作了一次訪問請求。併發

重定向過程:客戶瀏覽器發送http請求----》web服務器接受後發送302狀態 碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location 地址----》服務器根據此請求尋找資源併發送給客戶。在這裏 location能夠重定向到任意URL,既然是瀏覽器從新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的 路徑,客戶能夠觀察到地址的變化的。重定向行爲是瀏覽器作了至少兩次的訪問請求的。jsp

 

參考資料:(本博客借鑑下面兩位大牛的文章,整理了一下,僅用於學習)學習

http://blog.csdn.net/kobejayandy/article/details/13762043url

http://www.cnblogs.com/CodeGuy/archive/2012/02/13/2349970.htmlspa

相關文章
相關標籤/搜索