<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如何學好java

    如何學好java,其實很簡單,只要用心體會,慢慢積累!
    posts - 106, comments - 7, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    重定向和轉發的區別

    Posted on 2011-04-26 23:13 哈希 閱讀(177) 評論(0)  編輯  收藏 所屬分類: java面試題


    區別一:

      重定向時瀏覽器上的網址改變

      轉發是瀏覽器上的網址不變

    區別二:

      重定向實際上產生了兩次請求

    轉發只有一次請求 

    重定向: 

      發送請求 -->服務器運行-->響應請求,返回給瀏覽器一個新的地址與響應碼-->瀏覽器根據響應碼,判定該響應為重定向,自動發送一個新的請求給服務器,請求地址為之前返回的地址-->服務器運行-->響應請求給瀏覽器 

    轉發: 

      發送請求 -->服務器運行-->進行請求的重新設置,例如通過request.setAttribute(name,value)-->根據轉發的地址,獲取該地址的網頁-->響應請求給瀏覽器 

    區別三:

      重定向時的網址可以是任何網址

      轉發的網址必須是本站點的網址

    詳解:

      重定向:以前的request中存放的變量全部失效,并進入一個新的request作用域。
    轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。

    正文開始: 

      先是看上去不同,他們的調用分別如下:
    request.getRequestDispatcher("apage.jsp").forward(request, response);//轉發到apage.jsp
    response.sendRedirect("apage.jsp");//重定向到apage.jsp
    在jsp頁面中你也會看到通過下面的方式實現轉發:
    <jsp:forward page="apage.jsp" />
    我在初學jsp的時候,對這兩個概念非常模糊,看別人的例子的時候,也是一頭霧水,不知道什么時候該用哪個。希望下面的解說能對你有所幫助。
    提到轉發和重定向就不得不提到request作用域。很多初學者都知道當我們提交一個表單時,就創建了一個新的請求。實際上,當我們點擊一個鏈接時,也創建了一個新的請求。那么一個請求的作用于到底有多大呢?例如:
    在頁面a.jsp中有一個鏈接<a href="b.jsp?id=1">這是指向b的一個鏈接,而且還帶了一個參數</a>。當我們點擊這個連接的時候,就產生了一個請求,為了明確起見,我們把它叫做requestA->B?,F在,在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 contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    <a href="b.jsp?id=1">指向b.jsp,而且還帶了一個參數id=1。requestA-B現在誕生了</a>
    </body>
    </html> 

    b.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <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 contentType="text/html; charset=GBK" %>
    <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 contentType="text/html; charset=GBK" %>
    <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)中用到,所以要用轉發。 

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

    主站蜘蛛池模板: 精品久久久久久亚洲精品| 久久99亚洲网美利坚合众国| 亚洲情A成黄在线观看动漫软件| 人妻丰满熟妇无码区免费| 亚洲AV人无码激艳猛片| 99久久久国产精品免费蜜臀| 久久夜色精品国产嚕嚕亚洲av| 久久国产精品成人免费| 色婷婷六月亚洲婷婷丁香| 亚洲成人在线免费观看| 亚洲冬月枫中文字幕在线看| 欧美三级在线电影免费| 久久精品国产亚洲AV天海翼| 亚洲av午夜精品一区二区三区| 99re6免费视频| 亚洲1234区乱码| 精品久久久久久久免费加勒比| 色天使亚洲综合一区二区| 亚洲成?Ⅴ人在线观看无码| 亚欧洲精品在线视频免费观看| 亚洲人成图片小说网站| 无码国产精品一区二区免费3p | 亚洲午夜AV无码专区在线播放| 人人爽人人爽人人片av免费| 亚洲精品制服丝袜四区| 91久久成人免费| 亚洲AV永久无码精品网站在线观看| 亚洲精品99久久久久中文字幕 | 亚洲AV日韩精品久久久久久久| 亚洲精品视频免费在线观看| 亚洲高清乱码午夜电影网| AV在线亚洲男人的天堂| 120秒男女动态视频免费| 亚洲私人无码综合久久网| 国产亚洲精品久久久久秋霞 | 中文字幕精品亚洲无线码一区应用| 亚洲精品免费观看| 综合一区自拍亚洲综合图区| 亚洲国产精品久久久久| 四虎免费影院4hu永久免费| 色猫咪免费人成网站在线观看|