轉發和重定向的區別(轉)

發表於2008-03-28
不要僅僅為了把變數傳到下一個頁面而使用session作用域,那會無故增大變數的作用域,轉發也許可以幫助你解決這個問題。
重定向:以前的request中存放的變數全部失效,並進入一個新的request作用域。
轉發:以前的request中存放的變數不會失效,就像把兩個頁面拼到了一起。[@more@]

正文開始:

先是看上去不同,他們的呼叫分別如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//轉發到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
在jsp頁面中你也會看到透過下面的方式實現轉發:

我在初學jsp的時候,對這兩個概念非常模糊,看別人的例子的時候,也是一頭霧水,不知道什麼時候該用哪個。希望下面的解說能對你有所幫

助。
提到轉發和重定向就不得不提到request作用域。很多初學者都知道當我們提交一個表單時,就建立了一個新的請求。實際上,當我們點選一個

連結時,也建立了一個新的請求。那麼一個請求的作用於到底有多大呢?例如:
在頁面a.jsp中有一個連結這是指向b的一個連結,而且還帶了一個引數。當我們點選這個連線的時候,就產生了一

個請求,為了明確起見,我們把它叫做requestA->B。現在,在b.jsp頁面中我們就可以從這個請求中獲取資訊了。在b.jsp中你可以寫入out.pr

intln(request.getParameter("id"))進行測試。下面更復雜一點,我們在b.jsp頁面中增加下面的語句:
request.setAttribute("name","funcreal");
out.println(request.getAttriblute("name"));//成功顯示了name變數的值。
現在在b.jsp中再增加一個連結:這是指向c的一個連結,而且還帶了一個引數,當我們點選這個連線的時候,將

產生一個新的請求,這時requestA-B也就安息了,新的請求叫做requestB-C。同樣的道理,在c.jsp中,我們可以訪問到的變數只有age,因為i

d,name這兩個變數都屬於requestA-B,此時他已經不存在了。下面是原始碼:
a.jsp



指向b.jsp,而且還帶了一個引數id=1。requestA-B現在誕生了

b.jsp



out.println("id=" + request.getParameter("id"));
request.setAttribute("name","Func Real");
out.println("name=" + request.getAttribute("name"));
%>
requestA-B已經結束了。指向c.jsp,而且還帶了一個引數age=23

c.jsp



out.println("id=" + request.getParameter("id"));
out.println("name=" + request.getAttribute("name"));
out.println("age=" + request.getParameter("age"));
%>

那麼轉發又是怎麼回事呢?現在增加一個頁面叫做d.jsp,並且在c.jsp中

相關文章