前言
在前面一片文章中筆者實現了一個簡單的登錄驗證的功能,在驗證中涉及到了兩種頁面
跳轉的方式 請求轉發 和重定向。那麼這兩種方式到底有什麼區別呢?在這篇文章中,筆者
將結合實例進行探討。
請求轉發
在實際的開發中我們有着這樣一種需求,即在客戶端瀏覽器的一次請求中我們希望這個請求
(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