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

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          這是我在網上找到的資料,本來我以為我知道他們的區別,認為主要是當前的請求變量是否繼續有效,但看了這個,了解了請求的作用范圍,才完全明白其中的原因,希望對大家有用。

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

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

          轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。

          正文開始:

          先是看上去不同,他們的調用分別如下:

          request.getRequestDispatcher("apage.jsp").forward(request, response);//轉發到apage.jsp

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

          在jsp頁面中你也會看到通過下面的方式實現轉發:

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

          提到轉發和重定向就不得不提到request作用域。很多初學者都知道當我們提交一個表單時,就創建了一個新的請求。實際上,當我們點擊一個鏈接時,也創建了一個新的請求。那么一個請求的作用域到底有多大呢?例如:

          在頁面a.jsp中有一個鏈接<a href="b.jsp?id=1">這是指向b的一個鏈接,而且還帶了一個參數</a>。當我們點擊這個連接的時候,就產生了一個請求,為了明確起見,我們把它叫做requestA->B。現在,在b.jsp頁面中我們就可以從這個請求中獲取信息了。在b.jsp中你可以寫入out.println(request.getParameter("id"))進行測試。下面更復雜一點,我們在b.jsp頁面中增加下面的語句:

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

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

          現在在b.jsp中再增加一個鏈接:<a href="c.jsp?age=23">這是指向c的一個鏈接,而且還帶了一個參數</a>,當我們點擊這個連接的時候,將產生一個新的請求,這時requestA-B也就安息了,新的請求叫做requestB-C。同樣的道理,在c.jsp中,我們可以訪問到的變量只有age,因為id,name這兩個變量都屬于requestA-B,此時他已經不存在了。下面是源代碼:

          a.jsp

          <%@ page c %>

          <html>

          <body bgcolor="#ffffff">

          <a href="b.jsp?id=1">指向b.jsp,而且還帶了一個參數id=1。requestA-B現在誕生了</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已經結束了。指向c.jsp,而且還帶了一個參數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>

          那么轉發又是怎么回事呢?現在增加一個頁面叫做d.jsp,并且在c.jsp中</body>前面增加一句<jsp:forward page="d.jsp"/>

          d.jsp

          <%@ page c %>

          <html>

          <body bgcolor="#ffffff">

          requestB-C的魔爪已經伸到了d.jsp頁面

          <%

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

          %>

          </body>

          </html>

          運行程序,你會發現c頁面中的內容沒有顯示出來,因為forward是自動執行的,地址欄中雖然是c.jsp但實際上,但瀏覽器中顯示的已經是d.jsp的內容了,而且看到了從b.jsp傳過來的參數。你可以簡單得這樣理解:轉發,就是延長了requestB-C的作用域,<jsp:forward page="d.jsp"/>,這一句話實際上是把c.jsp和d.jsp粘到了一起,他們就像是在一個頁面中。

          如果你用過struts,那么你就知道為什么在Action中,最后一句幾乎總是mapping.findForward("xxx");了。因為我們在這個Action中設置的請求作用域的變量都將會在下一個頁面(也許是另一個Action)中用到,所以要用轉發。

          總結:

          用重定向和轉發不是一個習慣問題。而是什么情況下必須用什么的問題。

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

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

          轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。

              forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。

          redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址, web應用程序會要求客戶端瀏覽器重新發出請求地址,客戶端會重新連接至所指定的地址,因此瀏覽器的地址會出現重新導向的信息,重新導向后的請求由瀏覽器發出。

          forward與include共享Request范圍內的對象,而redirect則不行,

          forward與include基本上都是轉發到context內部的資源,而redirect可以重定向到外部的資源

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

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 镇赉县| 杨浦区| 浦北县| 长宁区| 井冈山市| 凤山市| 舟山市| 门头沟区| 崇左市| 洱源县| 东海县| 桐柏县| 宜黄县| 巫山县| 白河县| 怀柔区| 平顺县| 潮安县| 探索| 澄城县| 蒙城县| 嘉兴市| 河南省| 梁河县| 新丰县| 视频| 博客| 会昌县| 卢湾区| 固原市| 古浪县| 井研县| 城步| 南川市| 满洲里市| 梁河县| 巴东县| 彭水| 白水县| 扎兰屯市| 西乌珠穆沁旗|