請求轉發

實現資源的跳轉。
代碼:
request.getRequestDispatcher("/servlet/RequestDemo").forward(request, response);
①一次請求對應一次響應,request對象是同一個。
②地址欄地址不會發生變化。
③請求轉發是服務器內部的並且是同一個WEB應用內部的資源跳轉;不能是在不同應用和不同服務器中的資源跳轉。
④在同一個Servlet中轉發不能進行多次!!(A既轉發B, 又轉發給C),但是可以進行多重轉發(比如A轉發給B, B再轉發給C)。
request開發細節:
①在轉發之前, 如果response緩沖區被寫入了數據但是還沒有打給瀏覽器, 在轉發時response緩沖區(數據)將會被清空。
例如:A轉發給B,在A中添加代碼response.getWriter().write("hi!");
會發現瀏覽器中並未得到"hi!"這段字符串的響應。
②在轉發之前, 如果response緩沖區被寫入了數據並且已經打給了瀏覽器, 轉發將會失敗!
例如:A轉發給B,在A中添加代碼
response.getWriter().write("hi!");
response.flushBuffer();
會發現瀏覽器可以顯示"hi!",因為強制刷新了。但是轉發就會報錯,因為已經響應過了,一次請求對應一次響應。
重定向

可以通過302狀態碼加上location響應頭實現請求重定向。
代碼:
response.setStatus(302);
response.setHeader(“location”, “/web/index.jsp”);
上面兩行代碼等價於下面這一行<===>
response.sendRedirect(“/web/index.jsp”);
①兩次請求,兩次響應,request對象不是同一個。
②地址欄地址會發生變化。
③既可以實現在同一個WEB應用內部資源之間進行跳轉,也可以在不同的WEB應用和不同服務器資源之間進行跳轉。
④由於是兩次請求,兩次響應,無法通過request對象共享數據。
定時刷新
與重定向類似,不同之處就是可以指定幾秒之后跳轉。
可以通過refresh頭實現在多少秒之后跳轉指定的資源.
代碼:
response.setHeader(“refresh”, “3;url=/web/index.jsp”);
①兩次請求,兩次響應,request對象不是同一個。
②地址欄地址會發生變化。
③既可以實現在同一個WEB應用內部資源之間進行跳轉,也可以在不同的WEB應用和不同服務器資源之間進行跳轉。
④和重定向不同的是,定時刷新可以在刷新到新的地址之間設置一個時間,在間隔的這段時間內可以輸出文本到瀏覽器並維系一段時間。
轉發和重定向區別總結
轉發在服務器端完成的;重定向是在客戶端完成的
轉發的速度快;重定向速度慢
轉發的是同一次請求;重定向是兩次不同請求
轉發地址欄沒有變化;重定向地址欄有變化
選擇資源跳轉的方式
如果是同一服務器中的同一應用內部的資源跳轉:
①如果在跳轉時,需要通過request對象帶數據到目的地,只能用請求轉發。
②如果在跳轉時,希望地址欄地址不要發生變化,只能用請求轉發。
③如果在跳轉時,希望地址欄地址發生變化,只能使用重定向或定時刷新。
④如果沒有什么具體需要,三種方式都可以,最好使用請求轉發,可以減少訪問服務器的次數,降低服務器的壓力。
如果是不同服務器或不同WEB應用內部的資源跳轉, 只能用重定向或者定時刷新:
由於重定向是立即跳轉,而定時刷新是在多少秒之后再進行跳轉。並且可以在跳轉之前的時間里輸出文本數據到瀏覽器並維系一段時間。
如果跳轉時,需要指定多少秒或者是需要在跳轉之前發送數據到瀏覽器,只能使用定時刷新,否則兩種方式都可以。
