forward和redirect的區別


     forward方式:request.getRequestDispatcher("/somePage.jsp").forward(request, response);    
    redirect方式:response.sendRedirect("/somePage.jsp");
  forward是服務器內部重定向,程序收到請求后重新定向到另一個程序,客戶機並不知道;redirect則是服務器收到請求后發送一個狀態頭給客戶,客戶將再請求一次,這里多了兩次網絡通信的來往。當然forward也有缺點,就是forward的頁面的路徑如果是相對路徑就會有些問題了。forward會將request state ,bean等等信息帶往下一個jsp。redirect是送到client端后再一次request,所以資料不被保留.使用forward你就可以用getAttribute()來取的前一個jsp所放入的bean等等資料。

  在網上看到一些帖子,總結了一些區別,可以從以下幾個方面來看:

1.從地址欄顯示來說

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

  redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.所以redirect等於客戶端向服務器端發出兩次request,同時也接受兩次response。

2.從數據共享來說

  forward:轉發頁面和轉發到的頁面可以共享request里面的數據.
  redirect:不能共享數據.

  redirect不僅可以重定向到當前應用程序的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源.forward,方法只能在同一個Web應用程序內的資源之間轉發請求.forward 是服務器內部的一種操作.redirect 是服務器通知客戶端,讓客戶端重新發起請求.所以,你可以說 redirect是一種間接的請求, 但是你不能說"一個請求是屬於forward還是redirect "
3.從運用地方來說

  forward:一般用於用戶登陸的時候,根據角色轉發到相應的模塊.

  redirect:一般用於用戶注銷登陸時返回主頁面和跳轉到其它的網站等.

4.從效率來說
  forward:高.
  redirect:低.

5.jsp 語法

<jsp:forward page={"relativeurl" | "<%= expression %>"} />
View Code

或者這樣寫:  

<jsp:forward page={"relativeurl" | "<%= expression %>"} >
    <jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+
</jsp:forward>
View Code

6.例子

<jsp:forward page="/servlet/login.jsp" />

<jsp:forward page="/servlet/login.jsp">

    <jsp:param name="username" value="jsmith" />

</jsp:forward>
View Code

描述

  <jsp:forward>標簽從一個jsp文件向另一個文件傳遞一個包含用戶請求的request對象.<jsp:forward>標簽以下的代碼,將不能執行.你能夠向目標文件傳送參數和值,在這個例子中我們傳遞的參數名為username,值為scott,如果你使用了<jsp:param>標簽的話,目標文件必須是一個動態的文件,能夠處理參數.如果你使用了非緩沖輸出的話,那么使用<jsp:forward>時就要小心。如果在你使用<jsp:forward>之前,jsp文件已經有了數據,那么文件執行就會出錯.

屬性

page="{relativeurl | <%= expression %>}"
View Code

這里是一個表達式或是一個字符串用於說明你將要定向的文件或url.這個文件可以是jsp,程序段,或者其它能夠處理request對象的文件(如asp,cgi,php).

<jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />
View Code

向一個動態文件發送一個或多個參數,這個文件一定是動態文件.如果你想傳遞多個參數,你可以在一個jsp文件中使用多個<jsp:param>。name指定參數名,value指定參數值.

<jsp:forward>例子

 <%@ page contentType="text/html;charset=gb2312" %>
<html>
       <head>
              <title>test</title>
       </head>
       <body>
              <jsp:forward page="forwardTo.jsp">
                     <jsp:param name="userName" value="riso"/>
              </jsp:forward>
       </body>
</html>
View Code

forwardTo.jsp

 <%@ page contentType="text/html;charset=gb2312" %>
<!--forwardTo.jsp-->
<%
       String useName=request.getParameter("userName");
       String outStr= "謝謝光臨!";
       outStr+=useName;
       out.println(outStr);
%>
View Code

redirect的例子:

  譬如:client 通過XXX\index.jsp?name=gauss&pwd=123訪問index.jsp,而index.jsp中有< jsp:forward page="login.jsp"/>,則在login.jsp中可以通過request.getParameter()得到name和pwd, 而<%response.sendRedirect("login.jsp");%>得不到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM