esponse.sendRedirect方式的轉向與RequestDispatcher的forward方法的比較

esponse.sendRedirect方式的轉向與RequestDispatcher的forward方法的比較

Java Web開發中,採用MVC模式的時候,在控制器完成模型的調用以後會選擇界面對用戶響應,用常有兩種方式:java

一、經過response對象的sendRedirect方法。瀏覽器

二、經過RequestDispatcher對象的forward方法。服務器

例如要跳轉登陸界面login.jsp,可使用下面的兩種方式:session

一、使用responsejsp

response.sendRedirect("login.jsp");spa

二、使用RequestDispatcher.net

RequestDispatcher rd = request.getRequestDispatcher("login.jsp");對象

rd.forward(request,response);blog

這兩種方式有什麼區別?什麼狀況下應該使用哪種方式呢?開發

首先介紹二者的區別。

第一點區別,過程不一樣:第一種方式至關於瀏覽器接收到了響應以後又向服務器發送了一次請求,因此至關於兩次請求。第二種方式至關於方法調用,在執行當前文件的過程當中轉向執行目標文件,兩個文件(當前文件和目標文件)屬於同一次請求,最本質的特色就是兩次請求共享了reques對象和response對象。

第二點區別,地址欄不一樣:第一種方式下用戶在瀏覽器地址欄中看到的是目標文件的地址,第二種方式下用戶在瀏覽器地址欄中看到的是當前文件的地址。這一點也很是重要,後面介紹。

在使用的時候具體應如何選擇呢?

若是兩個文件的關係很是密切,則應該使用RequestDispatcher,若是兩個文件沒有直接的關聯關係,則應該使用response的sendRedirect方法。什麼樣的關係算是關係密切,什麼樣的關係算是沒有直接的關聯關係呢?例如查詢的控制器和查詢的結果界面之間就應該算是關係密切,由於查詢控制器處理完以後確定要轉向查詢結果界面。再例如添加信息的控制器和查詢控制器之間的關係就是沒有直接關係,一般在添加信息以後會跳轉到列表界面的控制器而後再跳轉到列表界面,修改信息或者刪除信息以後也可能會跳轉到列表界面的控制器而後再跳轉到列表界面。

下面是兩個比較特殊的應用:

一、若是但願經過request把當前在控制器中獲取的信息傳遞給目標文件(經過request.setAttribute和request.getAttribute),這時候應該選擇RequestDispatcher。由於須要當前文件和目標文件共享request對象。一般用於查詢。

二、對數據進行修改(包括刪除和添加操做)的功能的控制器與以後的界面或者控制器應該採用response.sendRedirect方式。若是採用了RequestDiapatcher的forward方式,會產生嚴重錯誤。由於地址欄是修改信息的控制器,若是用戶在刷新的時候,會從新發送一次對數據進行修改的請求,這不是用戶想看到的結果。因此有同窗在作添加功能的時候,每刷新一次就添加一條。

如何採用第二種方式,如何傳遞數據呢?有兩種方式:

一、能夠選擇session,可是在第二個文件中必定要刪除。

二、能夠在請求字符串中編寫,例如login.jsp?info="用戶不存在!"

轉的sina博客.

相關文章
相關標籤/搜索