1. 程式人生 > >forward,include,redirect學習

forward,include,redirect學習

查了一下API,
[size=x-large][b]forward:[/b][/size]
有兩個介面帶有RequestDispatcher getRequestDispatcher(String path)方法

javax.servlet.ServletContext.getRequestDispatcher(String path)
javax.servlet.ServletRequest.getRequestDispatcher(String path)

javax.servlet.RequestDispatcher有兩個方法:

void include(ServletRequest request, ServletResponse response)

其中這裡的path必須開始為"/",即這裡的path必須相對於context的root.

void forward(ServletRequest request, ServletResponse response)

這裡的path可以為相對路徑,如果path開始為"/",則也認為是從context的root開始的

[size=x-large][b]redirect[/b][/size]

javax.servlet.http.HttpServletResponse.sendRedirect(String location)

Sends a temporary redirect response to the client using the specified redirect location URL.

區別:
1、forward與include訪問獲取Request範圍內的物件,而sendRedirect只能獲取URL後面帶的引數,不能獲取Request範圍其它的物件(例如bean),因為forward是這樣傳遞引數的:

<jsp:useBean id="ub" class="UserBean" scope="request"/>
<jsp:setProperty name="ub" property="UserName" value="sa"/>
<jsp:setProperty name="ub" property="Password" value="123"/>
<jsp:forward page="index.jsp">
</jsp:forward>

當然,如果Bean的作用域是Session的話,用sendRedirect也能取到的。

2、forward與include只能訪問應用(站點)內的資源,而sendRedirect可以訪問內部和外部的資源;貌似forward與include比sendRedirect更安全一些;
3、forward到下一個頁面時,客戶端不清楚,保留原來的request;而使用sendRedirect時,客戶端要再發送一個request來,這樣sendRedirect會導致伺服器端要處理兩個request,效率有點差;但如果是表單提交,完成之後使用forward,就會導致頁面內容雖然變了,但瀏覽器上位址列地址沒有變,再一重新整理的話,會有重複的資料產生;

[b][size=xx-large]綜上:[/size][/b][b][color=blue]
1、需要使用上一個頁面的request的時候,使用forward比較好;而一個業務處理完成,那麼使用sendRedirect比較好;
2、當兩個頁面之間沒什麼關係,或者需要降低耦合的時候,建議使用sendRedirect,還有就是sendRedirect能夠防止重新整理和方便使用者將頁面加入收藏夾,這也是為什麼sendRedirect比較流行使用的原因
3、每個方法都有其適用的範圍和環境,需求不同時應該使用不同的方法。[/color][/b]