隨筆 - 26  文章 - 2  trackbacks - 0
          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          這是我在網(wǎng)上找到的資料,本來我以為我知道他們的區(qū)別,認(rèn)為主要是當(dāng)前的請(qǐng)求變量是否繼續(xù)有效,但看了這個(gè),了解了請(qǐng)求的作用范圍,才完全明白其中的原因,希望對(duì)大家有用。

          不要僅僅為了把變量傳到下一個(gè)頁面而使用session作用域,那會(huì)無故增大變量的作用域,轉(zhuǎn)發(fā)也許可以幫助你解決這個(gè)問題。

          重定向:以前的request中存放的變量全部失效,并進(jìn)入一個(gè)新的request作用域。

          轉(zhuǎn)發(fā):以前的request中存放的變量不會(huì)失效,就像把兩個(gè)頁面拼到了一起。

          正文開始:

          先是看上去不同,他們的調(diào)用分別如下:

          request.getRequestDispatcher("apage.jsp").forward(request, response);//轉(zhuǎn)發(fā)到apage.jsp

          response.sendRedirect("apage.jsp");//重定向到apage.jsp

          在jsp頁面中你也會(huì)看到通過下面的方式實(shí)現(xiàn)轉(zhuǎn)發(fā):

          <jsp:forward page="apage.jsp" />

          提到轉(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)求的作用域到底有多大呢?例如:

          在頁面a.jsp中有一個(gè)鏈接<a href="b.jsp?id=1">這是指向b的一個(gè)鏈接,而且還帶了一個(gè)參數(shù)</a>。當(dāng)我們點(diǎn)擊這個(gè)連接的時(shí)候,就產(chǎn)生了一個(gè)請(qǐng)求,為了明確起見,我們把它叫做requestA->B?,F(xiàn)在,在b.jsp頁面中我們就可以從這個(gè)請(qǐng)求中獲取信息了。在b.jsp中你可以寫入out.println(request.getParameter("id"))進(jìn)行測(cè)試。下面更復(fù)雜一點(diǎn),我們?cè)赽.jsp頁面中增加下面的語句:

          request.setAttribute("name","funcreal");

          out.println(request.getAttriblute("name"));//成功顯示了name變量的值。

          現(xiàn)在在b.jsp中再增加一個(gè)鏈接:<a href="c.jsp?age=23">這是指向c的一個(gè)鏈接,而且還帶了一個(gè)參數(shù)</a>,當(dāng)我們點(diǎn)擊這個(gè)連接的時(shí)候,將產(chǎn)生一個(gè)新的請(qǐng)求,這時(shí)requestA-B也就安息了,新的請(qǐng)求叫做requestB-C。同樣的道理,在c.jsp中,我們可以訪問到的變量只有age,因?yàn)閕d,name這兩個(gè)變量都屬于requestA-B,此時(shí)他已經(jīng)不存在了。下面是源代碼:

          a.jsp

          <%@ page c %>

          <html>

          <body bgcolor="#ffffff">

          <a href="b.jsp?id=1">指向b.jsp,而且還帶了一個(gè)參數(shù)id=1。requestA-B現(xiàn)在誕生了</a>

          </body>

          </html>

          b.jsp

          <%@ page c %>

          <html>

          <body bgcolor="#ffffff">

          <%

          out.println("id=" + request.getParameter("id"));

          request.setAttribute("name","Func Real");

          out.println("name=" + request.getAttribute("name"));

          %>

          <a href="c.jsp?age=23">requestA-B已經(jīng)結(jié)束了。指向c.jsp,而且還帶了一個(gè)參數(shù)age=23</a>

          </body>

          </html>

          c.jsp

          <%@ page c %>

          <html>

          <body bgcolor="#ffffff">

          <%

          out.println("id=" + request.getParameter("id"));

          out.println("name=" + request.getAttribute("name"));

          out.println("age=" + request.getParameter("age"));

          %>

          </body>

          </html>

          那么轉(zhuǎn)發(fā)又是怎么回事呢?現(xiàn)在增加一個(gè)頁面叫做d.jsp,并且在c.jsp中</body>前面增加一句<jsp:forward page="d.jsp"/>

          d.jsp

          <%@ page c %>

          <html>

          <body bgcolor="#ffffff">

          requestB-C的魔爪已經(jīng)伸到了d.jsp頁面

          <%

          out.println("age=" + request.getParameter("age"));

          %>

          </body>

          </html>

          運(yùn)行程序,你會(huì)發(fā)現(xiàn)c頁面中的內(nèi)容沒有顯示出來,因?yàn)閒orward是自動(dòng)執(zhí)行的,地址欄中雖然是c.jsp但實(shí)際上,但瀏覽器中顯示的已經(jīng)是d.jsp的內(nèi)容了,而且看到了從b.jsp傳過來的參數(shù)。你可以簡(jiǎn)單得這樣理解:轉(zhuǎn)發(fā),就是延長(zhǎng)了requestB-C的作用域,<jsp:forward page="d.jsp"/>,這一句話實(shí)際上是把c.jsp和d.jsp粘到了一起,他們就像是在一個(gè)頁面中。

          如果你用過struts,那么你就知道為什么在Action中,最后一句幾乎總是mapping.findForward("xxx");了。因?yàn)槲覀冊(cè)谶@個(gè)Action中設(shè)置的請(qǐng)求作用域的變量都將會(huì)在下一個(gè)頁面(也許是另一個(gè)Action)中用到,所以要用轉(zhuǎn)發(fā)。

          總結(jié):

          用重定向和轉(zhuǎn)發(fā)不是一個(gè)習(xí)慣問題。而是什么情況下必須用什么的問題。

          不要僅僅為了把變量傳到下一個(gè)頁面而使用session作用域,那會(huì)無故增大變量的作用域,轉(zhuǎn)發(fā)也許可以幫助你解決這個(gè)問題。

          重定向:以前的request中存放的變量全部失效,并進(jìn)入一個(gè)新的request作用域。

          轉(zhuǎn)發(fā):以前的request中存放的變量不會(huì)失效,就像把兩個(gè)頁面拼到了一起。

              forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。

          redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址, web應(yīng)用程序會(huì)要求客戶端瀏覽器重新發(fā)出請(qǐng)求地址,客戶端會(huì)重新連接至所指定的地址,因此瀏覽器的地址會(huì)出現(xiàn)重新導(dǎo)向的信息,重新導(dǎo)向后的請(qǐng)求由瀏覽器發(fā)出。

          forward與include共享Request范圍內(nèi)的對(duì)象,而redirect則不行,

          forward與include基本上都是轉(zhuǎn)發(fā)到context內(nèi)部的資源,而redirect可以重定向到外部的資源

          posted on 2011-10-09 17:41 Java_liyadong 閱讀(1303) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 兴宁市| 陇川县| 淳安县| 岳阳县| 菏泽市| 芦溪县| 盘锦市| 东乡| 义乌市| 鲁甸县| 分宜县| 娄底市| 府谷县| 米泉市| 石林| 固安县| 汽车| 定襄县| 区。| 北海市| 将乐县| 抚顺市| 桃园市| 甘谷县| 新和县| 仁怀市| 宣城市| 育儿| 章丘市| 乡宁县| 会昌县| 沙河市| 长泰县| 石屏县| 自治县| 兴海县| 宁河县| 河南省| 舒城县| 秭归县| 商城县|