forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response);
redirect方式:response.sendRedirect("/somePage.jsp");
forward是服務(wù)器內(nèi)部重定向,程序收到請求后重新定向到另一個(gè)程序,客戶機(jī)并不知道;redirect則是服務(wù)器收到請求后發(fā)送一個(gè)狀態(tài)頭給客戶,客戶將再請求一次,這里多了兩次網(wǎng)絡(luò)通信的來往。當(dāng)然forward也有缺點(diǎn),就是forward的頁面的路徑如果是相對(duì)路徑就會(huì)有些問題了。
redirect 是送到 client 端后再一次 request , 所以資料不被保留.
使用 forward 你就可以用 getAttribute() 來取的前一個(gè) jsp 所放入的 bean 等等資料
在網(wǎng)上看到一些帖子,總結(jié)了一些區(qū)別,可以從以下幾個(gè)方面來看:
1.從地址欄顯示來說
forward是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,所以它的地址欄還是原來的地址.
redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請求那個(gè)地址.所以地址欄顯示的是新的URL.所以redirect等于客戶端向服務(wù)器端發(fā)出兩次request,同時(shí)也接受兩次response。
2.從數(shù)據(jù)共享來說
forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù).
redirect:不能共享數(shù)據(jù).
redirect不僅可以重定向到當(dāng)前應(yīng)用程序的其他資源,還可以重定向到同一個(gè)站點(diǎn)上的其他應(yīng)用程序中的資源,甚至是使用絕對(duì)URL重定向到其他站點(diǎn)的資源.
forward,方法只能在同一個(gè)Web應(yīng)用程序內(nèi)的資源之間轉(zhuǎn)發(fā)請求.forward 是服務(wù)器內(nèi)部的一種操作.
redirect 是服務(wù)器通知客戶端,讓客戶端重新發(fā)起請求.
所以,你可以說 redirect 是一種間接的請求, 但是你不能說"一個(gè)請求是屬于forward還是redirect "
3.從運(yùn)用地方來說
forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊.
redirect:一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等.
4.從效率來說
forward:高.
redirect:低.
5.jsp 語法
<jsp:forward page={"relativeurl" | "<%= expression %>"} />
或者這樣寫:
<jsp:forward page={"relativeurl" | "<%= expression %>"} >
<jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+
</jsp:forward>
6.例子
<jsp:forward page="/servlet/login.jsp" />
<jsp:forward page="/servlet/login.jsp">
<jsp:param name="username" value="jsmith" />
</jsp:forward>
描述
<jsp:forward>標(biāo)簽從一個(gè)jsp文件向另一個(gè)文件傳遞一個(gè)包含用戶請求的request對(duì)象.<jsp:forward>標(biāo)簽以下的代碼,將不能執(zhí)行.
你能夠向目標(biāo)文件傳送參數(shù)和值,在這個(gè)例子中我們傳遞的參數(shù)名為username,值為scott,如果你使用了<jsp:param>標(biāo)簽的話,目標(biāo)文件必須是一個(gè)動(dòng)態(tài)的文件,能夠處理參數(shù).
如果你使用了非緩沖輸出的話,那么使用<jsp:forward>時(shí)就要小心。
如果在你使用<jsp:forward>之前,jsp文件已經(jīng)有了數(shù)據(jù),那么文件執(zhí)行就會(huì)出錯(cuò).
屬性
page="{relativeurl | <%= expression %>}"
這里是一個(gè)表達(dá)式或是一個(gè)字符串用于說明你將要定向的文件或url.這個(gè)文件可以是jsp,程序段,或者其它能夠處理request對(duì)象的文件(如asp,cgi,php).
<jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+
向一個(gè)動(dòng)態(tài)文件發(fā)送一個(gè)或多個(gè)參數(shù),這個(gè)文件一定是動(dòng)態(tài)文件.
如果你想傳遞多個(gè)參數(shù),你可以在一個(gè)jsp文件中使用多個(gè)<jsp:param>。name指定參數(shù)名,value指定參數(shù)值.
<jsp:forward>例子
<%@ page contentType="text/html;charset=gb2312" %>
<html>
</html>
forwardTo.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<!--forwardTo.jsp-->
<%
%>
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");%>得不到。
--------------------------------------------------------------------------------------------------
在Java Web開發(fā)中,經(jīng)常會(huì)用到跳轉(zhuǎn)頁面的方法,一般有下面兩種方法。
Java代碼
HttpServletResponse response = new HttpServletResponse();
response.sendRedirect(location);
RequestDispatcher rd = new RequestDispatcher();
rd.forward(request, response);
跳轉(zhuǎn)方式
http://localhost:8080/Test應(yīng)用
運(yùn)用forward方法只能重定向到同一個(gè)Web應(yīng)用程序中的一個(gè)資源。而sendRedirect方法可以讓你重定向到任何URL。
表單form的action= “/uu “;sendRedirect( “/uu “);表示相對(duì)于服務(wù)器根路徑。如http://localhost:8080/Test應(yīng)用(則提交至http://localhost:8080/uu);
Forward代碼中的 “/uu “則代表相對(duì)與WEB應(yīng)用的路徑。如http://localhost:8080/Test應(yīng)用(則提交至http://localhost:8080/Test/uu);
(運(yùn)用RequestDispatcher接口的Forward)方法
forward()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,
同時(shí)forward()無法在后面帶參數(shù)傳遞,比如servlet?name=frank,這樣不行,可以程序內(nèi)通過response.setAttribute( “name “,name)來傳至下一個(gè)頁面.
重定向后瀏覽器地址欄URL不變.
只有在客戶端沒有輸出時(shí)才可以調(diào)用forward方法。如果當(dāng)前頁面的緩沖區(qū)(buffer)不是空的,那么你在調(diào)用forward方法前必須先清空緩沖區(qū)。
“/ “代表相對(duì)與web應(yīng)用路徑
RequestDispatcher
rd.forward(request,
RequestDispatcher
rd.forward(request,
RequestDispatcher
rd.forward(request,
如果在 <jsp:forward> 之前有很多輸出,前面的輸出已使緩沖區(qū)滿,將自動(dòng)輸出到客戶端,那么該語句將不起作用,這一點(diǎn)應(yīng)該特別注意。
另外要注意:它不能改變?yōu)g覽器地址,刷新的話會(huì)導(dǎo)致重復(fù)提交
從http://localhost:8080/Test/gw/page.jsp中轉(zhuǎn)發(fā)
<jsp:forward
--------------------------------------------------------------------------------------------------
清空當(dāng)前緩存:
在之前撰寫JSP的例子中,實(shí)用了out這個(gè)對(duì)象,這個(gè)對(duì)象您不用事先宣告,就可以在JSP網(wǎng)頁中使用,這是JSP所提供的隱含對(duì)象
(Implicit Object),在轉(zhuǎn)譯為Servlet之后,out會(huì)轉(zhuǎn)換為對(duì)應(yīng)于javax.servlet.jsp.JspWriter型態(tài)的對(duì)象。
JspWriter直接繼承自java.io.Writer,您可以使用println()、print()方法將指定的數(shù)據(jù)以字符的方式傳送至客戶端,println()會(huì)
在送出數(shù)據(jù)之后進(jìn)行換行,而print()則否,注意換行指的是在HTML原始碼中設(shè)定換行字符,而不是輸出<br>標(biāo)簽使得在網(wǎng)頁中可以
換行。
out(JspWriter)具有緩沖區(qū)功能,HTTP的特性是為了要取得一份資源,就進(jìn)行一份協(xié)議溝通,如果資源數(shù)目很多(例如一份HTML文件
還包括了許多的小圖片),而每份資源的容量實(shí)際上很小,那么為了要取得完整的資源,將會(huì)花費(fèi)很多通訊在協(xié)議往來上,假設(shè)如果
out(JspWriter)不具有緩沖功能,則每一次out.println(),就會(huì)直接將數(shù)據(jù)送出至客戶端,那么單要完成一個(gè)完整網(wǎng)頁的傳送,就
會(huì)花費(fèi)不少的網(wǎng)絡(luò)資源,每一個(gè)JSP網(wǎng)頁預(yù)設(shè)上都會(huì)具有緩沖,您可以使用page指令元素的autoFlush屬性來設(shè)定是否使用緩沖區(qū)功能
。
在Tomcat5上,預(yù)設(shè)為每一個(gè)JSP網(wǎng)頁備有8192字節(jié)的緩沖區(qū)(您可以使用page指令元素的buffer屬性來自緩沖區(qū)的大小),在緩沖區(qū)還
沒有滿之前,數(shù)據(jù)不會(huì)真正被送出至客戶端,在這之前,您還有機(jī)會(huì)重設(shè)送出的數(shù)據(jù),如果緩沖區(qū)滿了,數(shù)據(jù)將會(huì)被清出并送至客戶
端,可以使用下面這個(gè)程序來示范:
buffer.jsp
<%@page contentType="text/html;charset=Big5"%>
<%
out.println("預(yù)設(shè)緩沖區(qū)大?。? + out.getBufferSize() + "<br>");
out.flush();
//下面的文字不會(huì)出現(xiàn)在客戶端
out.println("您看的到這段文字嗎?");
out.clearBuffer();
out.println("這段您可以看到!");
%>
您可以使用flush()直接清出緩沖區(qū)的內(nèi)容,而clearBuffer()會(huì)將緩沖區(qū)的內(nèi)容清除,所以第二段文字不會(huì)出現(xiàn)在客戶端的網(wǎng)頁上,
而最后一段會(huì)整個(gè)JSP網(wǎng)頁執(zhí)行完整后自動(dòng)送出至客戶端,執(zhí)行結(jié)果如下:
預(yù)設(shè)緩沖區(qū)大?。?192
這段您可以看到!
您可以使用page指令元素的autoFlush來設(shè)定JSP頁面是否使用緩沖區(qū)自動(dòng)清出功能,out(JspWriter)以一種方式與
HttpServletResponse的PrintWriter建立關(guān)系,兩者之間的行為關(guān)系取決于是否使用緩沖區(qū)自動(dòng)清出,如果使用緩沖區(qū)自動(dòng)清出,則
在緩沖區(qū)滿之前,或是使用flush()之前不會(huì)建立PrintWriter對(duì)象來對(duì)客戶端進(jìn)行輸出,如果不使用緩沖區(qū)自動(dòng)清出,則寫入out
(JspWriter)對(duì)象的數(shù)據(jù)會(huì)直接寫入PrintWriter對(duì)象,然后在指定flush()之后輸出至客戶端。
如果您將autoFlush設(shè)定為false,則您必須明確的使用flush()來輸出數(shù)據(jù),否則緩沖區(qū)滿了的話,就會(huì)發(fā)生IOException例外,使用
緩沖區(qū)有其好處,但由于緩沖區(qū)在滿之前,數(shù)據(jù)并不會(huì)真正送出客戶端,所以會(huì)有響應(yīng)延遲的問題,如果您要實(shí)時(shí)性將結(jié)果響應(yīng)至客
戶端,則可以關(guān)閉緩沖區(qū)。
下面這個(gè)程序測試緩沖區(qū)關(guān)閉之后,如果緩沖區(qū)滿了,會(huì)有什么結(jié)果:
buffer.jsp
<%@page contentType="text/html;charset=Big5" %>
<%
for(int i=0; i<2000; i++){
}
%>
如果沒有移開out.flush()的批注符號(hào),則會(huì)響應(yīng)一下的錯(cuò)誤訊息:
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error() that prevented it from fulfilling this request.
exception
java.io.IOException: Error: JSP Buffer overflow
......
聯(lián)系客服