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