| response.sendredirect('http://www./path/error.html');
 重定向和轉(zhuǎn)發(fā)有一個(gè)重要的不同:當(dāng)使用轉(zhuǎn)發(fā)時(shí),JSP容器將使用一個(gè)內(nèi)部的方法來(lái)調(diào)用目標(biāo)頁(yè)面,新的頁(yè)面繼續(xù)處理同一個(gè)請(qǐng)求,而瀏覽器將不會(huì)知道這個(gè)過(guò)程。 與之相反,重定向方式的含義是第一個(gè)頁(yè)面通知瀏覽器發(fā)送一個(gè)新的頁(yè)面請(qǐng)求。因?yàn)椋?dāng)你使用重定向時(shí),瀏覽器中所顯示的URL會(huì)變成新頁(yè)面的URL, 而當(dāng)使用轉(zhuǎn)發(fā)時(shí),該URL會(huì)保持不變。重定向的速度比轉(zhuǎn)發(fā)慢,因?yàn)闉g覽器還得發(fā)出一個(gè)新的請(qǐng)求。同時(shí),由于重定向方式產(chǎn)生了一個(gè)新的請(qǐng)求,所以經(jīng)過(guò)一次重 定向后,request內(nèi)的對(duì)象將無(wú)法使用。
 
 怎么選擇是重定向還是轉(zhuǎn)發(fā)呢?通常情況下轉(zhuǎn)發(fā)更快,而且能保持request內(nèi)的對(duì)象,所以他是第一選擇。但是由于在轉(zhuǎn)發(fā)之后,瀏覽器中URL仍然指向開(kāi)始頁(yè)面,此時(shí)如果重載當(dāng)前頁(yè)面,開(kāi)始頁(yè)面將會(huì)被重新調(diào)用。如果你不想看到這樣的情況,則選擇轉(zhuǎn)發(fā)。
 
 轉(zhuǎn)發(fā)和重定向的區(qū)別
 
 不要僅僅為了把變量傳到下一個(gè)頁(yè)面而使用session作用域,那會(huì)無(wú)故增大變量的作用域,轉(zhuǎn)發(fā)也許可以幫助你解決這個(gè)問(wèn)題。
 
 重定向:以前的request中存放的變量全部失效,并進(jìn)入一個(gè)新的request作用域。
 
 轉(zhuǎn)發(fā):以前的request中存放的變量不會(huì)失效,就像把兩個(gè)頁(yè)面拼到了一起。
 正文開(kāi)始: 先是看上去不同,他們的調(diào)用分別如下:
 request.getRequestDispatcher('apage.jsp').forward(request, response);//轉(zhuǎn)發(fā)到apage.jsp
 
 response.sendRedirect('apage.jsp');//重定向到apage.jsp
 
 在jsp頁(yè)面中你也會(huì)看到通過(guò)下面的方式實(shí)現(xiàn)轉(zhuǎn)發(fā):
 
 
 
 我在初學(xué)jsp的時(shí)候,對(duì)這兩個(gè)概念非常模糊,看別人的例子的時(shí)候,也是一頭霧水,不知道什么時(shí)候該用哪個(gè)。希望下面的解說(shuō)能對(duì)你有所幫助。
 
 提 到轉(zhuǎn)發(fā)和重定向就不得不提到request作用域。很多初學(xué)者都知道當(dāng)我們提交一個(gè)表單時(shí),就創(chuàng)建了一個(gè)新的請(qǐng)求。實(shí)際上,當(dāng)我們點(diǎn)擊一個(gè)鏈接時(shí),也創(chuàng)建 了一個(gè)新的請(qǐng)求。那么一個(gè)請(qǐng)求的作用于到底有多大呢?例如:在頁(yè)面a.jsp中有一個(gè)鏈接這是指向b的一個(gè)鏈接,而且還帶了一個(gè)參數(shù)。當(dāng)我們點(diǎn)擊這個(gè)連接的時(shí)候,就產(chǎn)生了一個(gè)請(qǐng) 求,為了明確起見(jiàn),我們把它叫做requestA->B?,F(xiàn)在,在b.jsp頁(yè)面中我們就可以從這個(gè)請(qǐng)求中獲取信息了。在b.jsp中你可以寫入 out.println(request.getParameter('id'))進(jìn)行測(cè)試。下面更復(fù)雜一點(diǎn),我們?cè)赽.jsp頁(yè)面中增加下面的語(yǔ)句:
 
 request.setAttribute('name','funcreal');
 
 out.println(request.getAttriblute('name'));//成功顯示了name變量的值。
 
 現(xiàn) 在在b.jsp中再增加一個(gè)鏈接:這是指向c的一個(gè)鏈接,而且還帶了一個(gè)參數(shù),當(dāng)我們點(diǎn)擊這個(gè)連接的時(shí)候,將產(chǎn)生一個(gè) 新的請(qǐng)求,這時(shí)requestA-B也就安息了,新的請(qǐng)求叫做requestB-C。同樣的道理,在c.jsp中,我們可以訪問(wèn)到的變量只有age,因?yàn)?id,name這兩個(gè)變量都屬于requestA-B,此時(shí)他已經(jīng)不存在了。下面是源代碼:
 a.jsp
 <%@ page contentType='text/html; charset=GBK' %>
 
 
 指向b.jsp,而且還帶了一個(gè)參數(shù)id=1。requestA-B現(xiàn)在誕生了
 
 
 b.jsp<%@ page contentType='text/html; charset=GBK' %>
 
 
 <%
 out.println('id=' + request.getParameter('id'));
 request.setAttribute('name','Func Real');
 out.println('name=' + request.getAttribute('name'));
 %>
 requestA-B已經(jīng)結(jié)束了。指向c.jsp,而且還帶了一個(gè)參數(shù)age=23
 
 
 c.jsp<%@ page contentType='text/html; charset=GBK' %>
 
 
 <%
 out.println('id=' + request.getParameter('id'));
 out.println('name=' + request.getAttribute('name'));
 out.println('age=' + request.getParameter('age'));
 %>
 
 
 那么轉(zhuǎn)發(fā)又是怎么回事呢?現(xiàn)在增加一個(gè)頁(yè)面叫做d.jsp,并且在c.jsp中 |