淺談JSP的Forward及sendRedirect方法
Response.sendRedirect是兩個不同的request,是在客戶端跳轉(zhuǎn),瀏覽器顯示的是跳轉(zhuǎn)后的頁面的名字。因為它是從客戶端跳轉(zhuǎn)到第二個頁面的。
使用forward時,由于只是發(fā)送一次request請求,request設(shè)置的屬性(setAttribute)依然能保留在下一個頁面。
使用sendRedirect時,由于發(fā)送兩次request請求,所以在下一個不能獲取request屬性。但可以通過重寫URL的方式
內(nèi)容傳遞過去。
下面舉例說明:
<%request.setAttribute("river","redwater");
request.setAttribute("country","daguaiwan");
%>
<jsp:forward page="fengshan.jsp" />
<%request.setAttribute("river","redwater");
request.setAttribute("country","daguaiwan");
%>
<a href="fengshan.jsp">fengshan</a>
<%request.setAttribute("river","redwater");
request.setAttribute("country","daguaiwan");
response.sendRedirect("fengshan.jsp");
%>
<%=request.getAttribute("river")%><br/>
<%=request.getAttribute("country")%>
- http://localhost:8080/ForwardRedirect/tiane.jsp 跳轉(zhuǎn)后結(jié)果為:
- redwater
- daguaiwan
- http://localhost:8080/ForwardRedirect/donglan.jsp 跳轉(zhuǎn)后結(jié)果為:
- null
- null
- http://localhost:8080/ForwardRedirect/bama.jsp 跳轉(zhuǎn)后結(jié)果為:
- null
- null
結(jié)果分析: tiane.jsp是通過forward跳轉(zhuǎn)到fengshan.jsp的,這兩個頁面享用的是同一個request,故fengshan.jsp可以接收到tiane.jsp通過 request設(shè)置的屬性。而donglan.jsp是通過href發(fā)送了另外的request請求,bama.jsp是通過sendRedirect跳轉(zhuǎn),用的也是另外的request請求,故fengshan.jsp不可以接收到這兩個頁面通過 request設(shè)置的屬性。 Jsp和Servlet之間的跳轉(zhuǎn):從Jsp跳轉(zhuǎn)Servlet可以使用或者response.sendRedirect(URL)都可以,它們之間的區(qū)別上面已經(jīng)說明了。 從Servlet跳轉(zhuǎn)Jsp: getRequestDispatcher的forward(request, response)方法,這里也只是發(fā)送了一次請求,可以在下一個頁面接受request設(shè)置的屬性。 ² response.sendRedirect(URL),這里發(fā)送了兩次請求,不可以在下一個頁面接受request設(shè)置的屬性。
例子如下: servlettiane.jsp
- <%request.setAttribute("river","redwater");
- request.setAttribute("country","daguaiwan");
- %>
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)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
再在web.xml中配置servlet:
- <servlet>
- <servlet-name>tiane</servlet-name>
- <servlet-class>com.dvnchina.test.Tiane</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>tiane</servlet-name>
- <url-pattern>/tiane</url-pattern>
- </servlet-mapping>
具體的結(jié)果我就不分析了,和第一個例子差不多的。代碼見附件。
【編輯推薦】