Servlet之請求轉發與重定向區別

         前言

                       在前面一片文章中筆者實現了一個簡單的登錄驗證的功能,在驗證中涉及到了兩種頁面

                 跳轉的方式  請求轉發重定向。那麼這兩種方式到底有什麼區別呢?在這篇文章中,筆者

                 將結合實例進行探討。

        請求轉發

                    在實際的開發中我們有着這樣一種需求,即在客戶端瀏覽器的一次請求中我們希望這個請求

               (Request)可以轉交給多個Servlet進行處理以完成更復雜的邏輯功能,這種把一次HTTP請求移

                交給多個Servlet進行處理的方式就是 請求轉發。

                    需要明白的是請求轉發是服務器端的行爲,當客戶端瀏覽器進行一次請求之後,請求轉發這一

                過程就不涉及到客戶端的行爲了。服務器通過RequestDispatcher對象將“請求”的控制權交給

                不同的Serlvet完成一些列的邏輯功能。

                    具體的過程如下:

                       客戶端瀏覽器發送HTTP請求(LoginSerlvet)-->Tomcat容器初始化LoginSerlet、並調用相關

                    業務邏輯方法-->LoginServlet通過RequestDispatcher將請求控制權移交給CheckSerlvet-->

                    checkServlet完成登錄驗證。

                    

                        值得注意的是請求轉發這一過程只能在同一web應用中進行

                        可以看出的是瀏覽器並未參與到請求轉發這一過程中去,而且我們可以從瀏覽器的地址的

                        情況來說明。雖然將請求轉發給CheckServlet但是瀏覽器地址仍顯示的是LoginSerlet

                        根據上圖可以知道請求轉發的調用方式是通過RequestDispatcher對象來實現的,具體調用

                    代碼如下:         

//跳轉到首頁,請求轉發方式 request.getRequestDispatcher("index.jsp").forward(request, response);
                     或者這種方式實現調用:
request.getRequestDispatcher("index.jsp").include(request, response);
                       那麼這兩種方式又有什麼區別呢?

                           forward方法是把請求的內容轉發到另外的一個servlet.而include是把另一個servlet處理過後

                        的內容拿過來.

                        口說無憑實例驗證一下:

                        //跳轉到首頁,請求轉發方式 			response.setCharacterEncoding("UTF-8"); 			response.getWriter().write("LoginCheck"); 			request.getRequestDispatcher("index.jsp").forward(request, response);
                         這種方式的頁面的輸出結果只顯示index.jsp本身的內容。

                       

                       

                       接下來看看include方式:

          

                        //跳轉到首頁,請求轉發方式 			response.setCharacterEncoding("UTF-8"); 			response.getWriter().write("LoginCheck"); 			request.getRequestDispatcher("index.jsp").include(request, response);
                        

                          舉個實例來說,請求轉發類似於這樣一種情況:某某要申請XXX稱號,申請書提交給A部門,

                         A部門完成相關流程之後提交給B部門,之後某某得到批准書之後,雖然有B的參與,但是某某

                         並不知情。

              重定向

                              重定向是指在客戶端發送一次請求的過程中,web服務器向客戶端瀏覽器發送一個HTTP響應,

                       瀏覽器接受此響應,並按照服務其提供的URL發送一個新的HTTP請求給服務器,這一過程就稱之

                      爲重定向過程。需要注意的是重定向可以定位到任意的URL,不僅限於當前的web應用。這點也

                      造成了其不能共享request、response數據。

                             

                            重定向是在客戶端發揮作用,通過請求新的地址實現頁面轉向。。
                             重定向是通過瀏覽器重新請求地址,在地址欄中可以顯示轉向後的地址。
                            對於此,我們通過一個實例說明:同樣以上篇的例子

              

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 		//Tomcat將表單信息封裝到請求正文中 		//通過request對象得到表單信息 		String name = request.getParameter("username"); 		String password = request.getParameter("password"); 		//驗證 		if(name.equals("kiritor")&&password.equals("kiritor")) 		{ 			//跳轉到首頁,請求轉發方式 			response.setCharacterEncoding("UTF-8"); 			response.getWriter().write("LoginCheck"); 			request.getRequestDispatcher("index.jsp").include(request, response); 		} 		else { 		    //跳轉錯誤信息頁面,請求重定向方式 			response.sendRedirect("error.jsp"); 		} 	}
                         這裏我們輸入錯誤的用戶名密碼

                        

                         可以看見的是,使用重定向的方式地址欄發生了變化!而且重定向的資源可以不限於本web

                         讀者可以自行嘗試。

                         同樣以申請xxx稱號爲例,你將申請書投遞到A部門,A部門對你說他們不負責這塊的業務讓你去

                         B部門,所以你重新將申請書投遞給B部門。重定向就是這個道理。

                     參考資料:

                         http://blog.csdn.net/meiyalei/article/details/2129120      

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章