在前面一片文章中筆者實現了一個簡單的登陸驗證的功能,在驗證中涉及到了兩種頁面java
跳轉的方式 請求轉發 和重定向。那麼這兩種方式到底有什麼區別呢?在這篇文章中,筆者web
將結合實例進行探討。瀏覽器
在實際的開發中咱們有着這樣一種需求,即在客戶端瀏覽器的一次請求中咱們但願這個請求服務器
(Request)能夠轉交給多個Servlet進行處理以完成更復雜的邏輯功能,這種把一次HTTP請求移jsp
交給多個Servlet進行處理的方式就是 請求轉發。ide
須要明白的是請求轉發是服務器端的行爲,當客戶端瀏覽器進行一次請求以後,請求轉發這一spa
過程就不涉及到客戶端的行爲了。服務器經過RequestDispatcher對象將「請求」的控制權交給.net
不一樣的Serlvet完成一些列的邏輯功能。code
具體的過程以下:對象
客戶端瀏覽器發送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部門。重定向就是這個道理。
參考資料: