1. 程式人生 > >請求轉發和請求重定向

請求轉發和請求重定向

tdi 之間 只知道 servlet 成了 區別 rep 發送請求 習慣

比喻:

請求轉發:A向B發送請求,想讓B幫忙完成一項工作,當B接收到請求後發現自己完成不了,於是B請C幫忙,C接收到B的請求後最終完成了該項工作,並把最後的結果返回給A。此過程A只發送了一次請求給B,A只知道把請求發給B,至於B是怎麽完成的A並不關心,他只等待最終的結果。 重定向:A向B發送請求,想讓B幫忙完成一項工作,當B接收到請求後發現自己無法完成,就立即告訴A情況,並向A推薦C可以完成該項工作,於是A就找C幫忙,C最終完成該項工作,返回給A。 不同點: 1、瀏覽器地址欄顯示不同(表面區別): 無論進行多少次請求,如果使用請求轉發來實現,瀏覽器地址欄中只顯示第一次發送請求的地址; 如果使用重定向來實現,瀏覽器地址欄顯示的是每次請求的新地址。這只是表面上看到的不同地方。 2、組件之間可否共享信息不同(本質區別
) 從本質上講,請求轉發時,從發送第一次到最後一次請求的過程中,WEB容器只創建一次request和response對象,請求之間始終共享這兩個對象,所以每個請求可以訪問他之前請求中的參數和屬性的值; 而重定向時,瀏覽器每發送一次請求,WEB容器都會重新創建新的request和response對象,所以請求之間不能共享信息,即不能在請求中訪問到他之前請求中的參數和屬性的值。 3、實現方式不同: 3.1 請求轉發的實現步驟: 1)說明將要轉發的資源; 2)獲取請求轉發的對象; 3) 調用請求轉發對象中forward()方法 Java代碼 1). String forward = "/a.jsp"; 2). RequestDispatcher rd = request.getRequestDispatcher(forward); 3). rd.forward(request, reponse); 綜合:request.getRequestDispatcher("/a.jsp").forward(request,response); 3.2 重定向的實現步驟: 1) 說明將要重定向的資源; 2) 調用response對象中sendRedirect方法 Java代碼 1. String resource = request.geContextPath() + "/a.jsp"; 2. response.sendRedirect(resource); 綜合:response.sendRediect(request.geContextPath() + "/a.jsp"); 4、知情人不同 請求轉發的過程只有WEB服務器知道,而瀏覽器不知道進行了多少次轉發,以及都轉發給哪些組件(servlet,JSP),它只是在等待WEB服務器最終的結果。 而重定向時,每發送一次請求,WEB服務器都會通知瀏覽器的,所以重定向了幾次請求以及每次都向哪個組件發送的請求,瀏覽器很清楚,當讓WEB服務器也很明白。 相同點
: 兩者都可以進行多次請求的轉發。 總結:什麽情況下使用重定向,什麽情況下請求轉發,這個不是看我們的習慣,而是什麽情況下必須用什麽: 重定向:之前的request中存放的變量全部失效並進入一個新session的作用域; 請求轉發:之前的request中存放的變量沒有失效,就想把兩個頁面拼在一起

請求轉發和請求重定向