一划乖、重定向和請求轉發(fā)的概念
以C/S模式為例:
請求轉發(fā):
request.getRequestDispatcher(URL).forward(request, response)艺配;
1.客戶端發(fā)送請求數(shù)據(jù)給服務器
2.服務器接收請求數(shù)據(jù)并調(diào)用第一個servlet處理邏輯
3.第一個servlet處理數(shù)據(jù)結束后將數(shù)據(jù)傳遞給下一個servlet
4.第二個servlet處理完數(shù)據(jù)后調(diào)用forward()方法將處理結果返回給客戶端。
請求轉發(fā)的特點:客戶端發(fā)送一次請求,請求數(shù)據(jù)流轉多個servlet(一次請求现斋,多個servlet聯(lián)動)吟孙,地址欄中只會出現(xiàn)第一次跳轉的地址。
請求轉發(fā)從發(fā)送請求中就已經(jīng)準備好進行數(shù)據(jù)流轉了即流轉數(shù)據(jù)存在于HTTP請求報頭中芥永。
重定向:
response.sendRedirect(URL)篡殷;
1.客戶端發(fā)送請求數(shù)據(jù)給服務器
2.服務器接收請求數(shù)據(jù)并調(diào)用servlet處理邏輯
3.服務器調(diào)用sendRedirect()方法將處理結果放進HTTP響應報頭中返回給客戶端
4.客戶端收到響應結果后再次發(fā)送請求數(shù)據(jù)給服務器,重復上述過程埋涧。
重定向的特點:客戶端會多次發(fā)送請求給服務器板辽。
重定向在向客戶端返回處理結果時才決定讓客戶端再一次發(fā)送一次請求。
二棘催、請求轉發(fā)和重定向的區(qū)別
共同點:兩種方式都可以實現(xiàn)瀏覽器頁面的跳轉
不同點:
1劲弦、數(shù)據(jù)共享問題
請求轉發(fā)的數(shù)據(jù)處理是在一次請求中,使用request對象可以實現(xiàn)數(shù)據(jù)共享醇坝。
重定向是兩次向客戶端發(fā)送請求邑跪,想要讓兩次請求數(shù)據(jù)共享必須使用session對象。
2、效率問題
請求轉發(fā)的效率高于重定向画畅。這是因為請求轉發(fā)是在服務器中跳轉頁面砸琅,而重定向需要重新再發(fā)送請求給服務器調(diào)用新的servlet來完成跳轉頁面。
3夜赵、頁面跳轉意圖所在之處問題
兩者都是在servlet處理數(shù)據(jù)結束后開始跳轉頁面的明棍。請求轉發(fā)和重定向兩者的根本區(qū)別是由于RequestDispatcher().forward()方法和sendRedirect()方法的不同導致的,前者屬于HttpServletRequest的方法寇僧,屬于請求中的方法摊腋;后者屬于HttpServletResponse的方法,屬于響應的方法嘁傀,所以請求轉發(fā)在發(fā)送請求時就要求聯(lián)動servlet兴蒸,而重定向是在準備返回處理結果時要求再一次重發(fā)請求。
三细办、請求轉發(fā)和重定向的使用時機
首先要明確橙凳,請求轉發(fā)在每次刷新時會重新向服務器發(fā)送請求,每刷新一次笑撞,就重新發(fā)送一次請求岛啸。
1、對于表單數(shù)據(jù)茴肥,在表單數(shù)據(jù)需要修改時往往不能重復提交坚踩,此時需要重定向(刷新會導致數(shù)據(jù)源提交出現(xiàn)問題)。
2瓤狐、判斷請求數(shù)據(jù)能否在一次請求中被處理或者判斷請求數(shù)據(jù)要放到request對象中還是session中瞬铸,根據(jù)數(shù)據(jù)的生存期來判斷以何種方式進行頁面跳轉。