頁面跳轉的兩種實現方式:請求轉發和重定向;
請求轉發:
客戶首先發送一個請求到服務器端,服務器端發現匹配的servlet,並指定它去執行,當這個servlet執行完之后,它要調用getRequestDispacther()方法,把請求轉發給指定的student_list.jsp,整個流程都是在服務器端完成的,而且是在同一個請求里面完成的,因此servlet和jsp共享的是同一個request,在servlet里面放的所有東西,在student_list中都能取出來,因此,student_list能把結果getAttribute()出來,getAttribute()出來后執行完把結果返回給客戶端。整個過程是一個請求,一個響應。
重定向:
客戶發送一個請求到服務器,服務器匹配servlet,servlet處理完之后調用了sendRedirect()方法,立即向客戶端返回這個響應,響應行告訴客戶端你必須要再發送一個請求,去訪問student_list.jsp,緊接着客戶端收到這個請求后,立刻發出一個新的請求,去請求student_list.jsp,這里兩個請求互不干擾,相互獨立,在前面request里面setAttribute()的任何東西,在后面的request里面都獲得不了。可見,在sendRedirect()里面是兩個請求,兩個響應。(服務器向瀏覽器發送一個302狀態碼以及一個location消息頭,瀏覽器收到請求后會向再次根據重定向地址發出請求)
請求轉發:request.getRequestDispatcher("/test.jsp").forword(request,response);
重定向:response.sendRedirect("/test.jsp");
區別:
1、請求次數:重定向是瀏覽器向服務器發送一個請求並收到響應后再次向一個新地址發出請求,轉發是服務器收到請求后為了完成響應跳轉到一個新的地址;重定向至少請求兩次,轉發請求一次;
2、地址欄不同:重定向地址欄會發生變化,轉發地址欄不會發生變化;
3、是否共享數據:重定向兩次請求不共享數據,轉發一次請求共享數據(在request級別使用信息共享,使用重定向必然出錯);
4、跳轉限制:重定向可以跳轉到任意URL,轉發只能跳轉本站點資源;
5、發生行為不同:重定向是客戶端行為,轉發是服務器端行為;
使用:
1、可以利用request的域對象的特點,由源組件向其中存放寫數據;
2、可以讓用戶訪問到存放在WEB-INF目錄中的目標資源;
3、重定向的速度比轉發慢,因為瀏覽器還得發出一個新的請求,所以如果在使用轉發和重定向都無所謂的時候建議使用轉發;
4、因為轉發只能訪問當前WEB的應用程序,所以不同WEB應用程序之間的訪問,特別是要訪問到另外一個WEB站點上的資源的情況,這個時候就只能使用重定向了。