轉發和重定向
轉發和重定向
轉發使用的方法
使用請求排程器 RequestDispatcher物件呼叫faward(request, response)實現,如何獲得 RequestDispatcher物件?可以使用request呼叫 getRequestDispatcher("轉發頁面的路徑") 獲得。
一個完整的轉發例子
RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
rd.faward(request, response);
重定向使用的方法
使用物件response呼叫sendRedirect(String location)實現重定向操作
具體程式碼是:
response.sendRedirect(重定向的頁面);
談一談轉發和重定向的區別:
轉發不會導致客戶端的位址列請求(URL)變化,重定向會導致客戶端URL變化。
Servlet轉發到JSP頁面或是Servlet後,被轉發的JSP頁面或是Servlet可以使用request.getAttribute()獲得轉發頁面中request物件中儲存的資料。Servlet重定向到JSP頁面或是Servlet後,被重定向的JSO頁面或是Servlet不能使用request.getAttribute()獲得重定向頁面request物件中儲存的資料。
什麼造成了轉發和重定向的區別?
在HTTP協議中,客戶端傳送一個HTTP請求給伺服器,伺服器處理後返回給客戶端一個HTTP響應。Servlet使用的就是HTTP協議。
轉發: 客戶端傳送請求給伺服器端,伺服器端處理請求,伺服器將請求轉發給當前應用可以接收的頁面或者Servlet,也就是說,不能轉發到不屬於當前應用處理不了的請求,要不然就404了。舉個例子,客戶端傳送請求,請求的是Servlet1,Servlet1可能處理不了,就把請求轉發到了Servlet2,Servlet2處理請求後返回給客戶端一個頁面。在這個過程中,使用者客戶端傳送請求後一直在等待伺服器返回響應,等待過程中是不知道請求的Servlet1把請求轉發給了Servlet2,伺服器端這時還沒有給客戶端任何響應,客戶端的位址列是請求的視窗,可以從位址列中看到客戶端傳送給伺服器端的請求,由於客戶端的請求沒變,所以看到的位址列資訊是不變的。轉發是在客戶端一次請求中完成的,所以被轉發的JSP頁面或者Servlet可以共享轉發Servlet的請求資料。當被轉發的需要獲得請求中儲存的資料時,需要使用的方法是String getParameter()和Object getAttribute(),說說getParameter()和getAttribute()的區別吧。當客戶端傳送請求時,請求中就帶了資料,比如在提交表單時表單欄位就會和請求一起被髮送到伺服器端,這個從客戶端來的資料在伺服器端使用getParameter()方法獲得值,由於是客戶端傳送過來的資料,所以在伺服器端不能修改只能檢視,否則只能讓客戶端再發送一個請求,也就是說沒有setParameter()。下面來講getAttribute(),從客戶端發來的資料不能使用getAttribute()獲得,但是伺服器中可以讓請求物件儲存一些資料,方便在轉發的時候讓被轉發的JSP頁面或者Servlet共享這些資料。舉個例子,客戶端傳送請求,請求的是Servlet1,在Servlet1中,把資料儲存在請求物件中,使用的程式碼是request.setAttribute("Test", "HelloWorld");意思是儲存了一個鍵值對在request中,方法規定鍵是String型別,值是Object型別。我們這裡將String型別的物件"HelloWorld"賦值給Object型別的引數,是子類物件賦值給父類物件,下轉上,自動轉換。Servlet1將客戶端發來的請求轉發給Servlet2,Servlet2可以使用getParameter()獲得客戶端發來的資料,也可以使用getAttribute()獲得Servlet1儲存在請求中的鍵值對資料。所以轉發可以共享一個HTTP請求的資料。
重定向:重定向方法sendRedirect()的使用者是response,response是伺服器響應物件,所以使用重定向時,意味著伺服器響應了一次客戶端請求,這樣的話,之前客戶端請求的生命週期就過了,伺服器如果在使用getParameter()或者getAttribute()就和之前的請求物件沒有關係了(之前的請求物件消失了,資料也沒有了)。重定向就是伺服器端傳送一個HTTP響應告訴客戶端,再發送一個HTTP請求到XXXX,所以客戶端的位址列會發生改變。