天天看點

forward、sendRedirect及Jsp和Servlet之間的跳轉

<jsp:forward>使用同一個request,是在伺服器端跳轉,浏覽器顯示的是第一個頁面的名字,因為用戶端(浏覽器)不知道它在伺服器端跳轉了。

Response.sendRedirect是兩個不同的request,是在用戶端跳轉,浏覽器顯示的是跳轉後的頁面的名字。因為它是從用戶端跳轉到第二個頁面的。

使用forward時,由于隻是發送一次request請求,request設定的屬性(setAttribute)依然能保留在下一個頁面。

使用sendRedirect時,由于發送兩次request請求,是以在下一個不能擷取request屬性。但可以通過重寫URL的方式将内容傳遞過去。

下面舉例說明:

tian.jsp    

<%request.setAttribute("river","redwater"); 

    request.setAttribute("country","daguaiwan"); 

%> 

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

donglan.jsp    

<a href="fengshan.jsp">fengshan</a> 

bama.jsp    

    response.sendRedirect("fengshan.jsp"); 

fengshan.jsp 

<%=request.getAttribute("river")%><br/> 

<%=request.getAttribute("country")%> 

redwater

daguaiwan

null

結果分析:

tiane.jsp是通過forward跳轉到fengshan.jsp的,這兩個頁面享用的是同一個request,故fengshan.jsp可以接收到tiane.jsp通過 request設定的屬性。

而donglan.jsp是通過href發送了另外的request請求,bama.jsp是通過sendRedirect跳轉,用的也是另外的request請求,故fengshan.jsp不可以接收到這兩個頁面通過 request設定的屬性。

Jsp和Servlet之間的跳轉:

從Jsp跳轉Servlet可以使用<jsp:forward page=”URL” />或者response.sendRedirect(URL)都可以,它們之間的差別上面已經說明了。

從Servlet跳轉Jsp:

² getRequestDispatcher的forward(request, response)方法,這裡也隻是發送了一次請求,可以在下一個頁面接受request設定的屬性。

² response.sendRedirect(URL),這裡發送了兩次請求,不可以在下一個頁面接受request設定的屬性。

例子如下:

servlettiane.jsp    

<jsp:forward page="/tiane" /> 

servletbama.jsp    

    response.sendRedirect("/ForwardRedirect/tiane"); 

Tiane.java 

public class Tiane extends HttpServlet { 

  public void doGet(HttpServletRequest request, HttpServletResponse response) 

      throws ServletException, IOException { 

//    response.sendRedirect("/ForwardRedirect/fengshan.jsp"); 

    this.getServletConfig().getServletContext() 

            .getRequestDispatcher("/fengshan.jsp").forward(request, response); 

  } 

  public void doPost(HttpServletRequest request, HttpServletResponse response) 

    doGet(request, response); 

  }    

再在web.xml中配置servlet: 

  <servlet> 

  <servlet-name>tiane</servlet-name> 

  <servlet-class>com.dvnchina.test.Tiane</servlet-class> 

  </servlet> 

  <servlet-mapping> 

  <url-pattern>/tiane</url-pattern> 

</servlet-mapping> 

具體的結果我就不分析了,和第一個例子差不多的。代碼見附件。

<a href="http://down.51cto.com/data/2352890" target="_blank">附件:http://down.51cto.com/data/2352890</a>

本文轉自 yzzh9 51CTO部落格,原文連結:http://blog.51cto.com/java999/164227,如需轉載請自行聯系原作者