国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
jsp/servlet中 forward, include, reDirect 之間的區(qū)別
討論它們的區(qū)別之前,先讓我們看下它們是怎樣被調(diào)用的?
 
Response.sendRedirect(redirect)
redirect="AccessGoalCharts.jsp?rcatID=3&rhaID=All_&doSearch=true”
實(shí)際上,container會(huì)將這個(gè) redirect的 url字符串重新送到
Browser interface,相當(dāng)于用戶重新在address欄中輸入了一個(gè)地址,赫赫,
這樣解釋簡單吧?
 
request.getRequestDispatcher("welcome.jsp").forward(request, response);
我們查一下web.xml,如果我們沒有找到相應(yīng)的servlet  mapping,那么這套
Request和response(也就是原來的browse interface)就被轉(zhuǎn)到 welcome.jsp
去處理了,welcome.jsp產(chǎn)生的html page也就被返回到了 response(也就是原來的browser interface).如果在web.xml當(dāng)中我們找到了相應(yīng)的 servlet mapping, 如下所示,
 <servlet-mapping>
    <servlet-name>DemoServlet</servlet-name>
    <url-pattern>/welcome.jsp</url-pattern>
 </servlet-mapping>
那么這套request和response就被forward到了DemoServlet的 doGet或者 doPost去處理了,問題是,getRequestDispatcher為什么不改名字叫做 getURLDispatcher,這不是更加符合 由 web.xml控制的實(shí)際情況嗎?
 
Request.getRequestDispatcher(“welcome.jsp”).include(request,response)和 forward(request,response)的情況一模一樣,區(qū)別在于,這個(gè)response,也就是 Browse Interface在接收了welcome.jsp產(chǎn)生的html page以后(假設(shè)在 web,xml當(dāng)中沒有相對(duì)應(yīng)于 welcome.jsp的 servlet-mapping),還可以在這個(gè)response( browser interface)當(dāng)中接收其他的html page,我測試過的代碼如下所示:
            request.getRequestDispatcher("welcome.jsp").include(request, response);
           
            PrintWriter out = response.getWriter();
            out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
            out.println("<HTML>");
            out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
            out.println(" <BODY>");
            out.print("    This is " + request.getParameter("name"));
            out.print(this.getClass());
            out.println(", using the POST method");
            out.println(" </BODY>");
            out.println("</HTML>");
            out.flush();
            out.close();
 
好了,還有一些考試大全中經(jīng)常描述的 forward對(duì)于 用戶來講是透明的,而 reDirect對(duì)于用戶來講是 在browser的地址欄中可見的講法,都是正確的講法.
 
 
好,我再用通俗的講法講解一下 sendRedirct, forward, include的區(qū)別 (基于 servlet api 2.2以上)
 (1)response.sendRedirect(String location) 
  Sends a temporary redirect response to the client using the specified redirect location URL
  實(shí)際上是給client返回一個(gè)臨時(shí)的response,里面也就一個(gè)url,告訴client,我現(xiàn)在已經(jīng)處理完了你的request,
  你應(yīng)該進(jìn)入這個(gè)URL,它會(huì)處理你的request了(這個(gè)request的內(nèi)容您這個(gè)client可能就不太清楚了)
  (2)requestDispatcher.forward(request, response)
  現(xiàn)在的servlet把控制權(quán)完全交給另外一個(gè)Servlet,這個(gè)servlet已經(jīng)預(yù)先處理過的request和response也一并移交過去,
  這個(gè)forward的過程實(shí)際上Client并不知道,是Server端的幾個(gè)servlet collaboration.
  (3)include又和 forward有什么區(qū)別呢?
  赫赫, requestDispatcher.include(request, response)
  好像沒有什么區(qū)別啊,include僅僅是include, 接收request的那個(gè)servlet (called servlet),它往printerWriter(或OutputStream,   writer是寫文本
  而stream是寫二進(jìn)制)中寫的內(nèi)容是 caller servlet往 printerWriter(或 outputStream)中寫的內(nèi)容的一部分.而  
  requestDispatcher.forward(request, response)就不一樣了,calling servlet控制權(quán)完全交出去了, calling servlet
  的response buffer中的東西都被清空了,所以如果你要 forward,就是轉(zhuǎn)移控制權(quán)的話, 你根本就不應(yīng)該在calling servlet
  中的response里面寫任何東西,寫了的話一旦 forward的話也就白瞎了,因?yàn)楸磺蹇樟寺?
  (4)為什么 request.getRequestDispatcher 而 response.sendRedirect(new_url)呢?
  我舉個(gè)簡單的例子,    request.getRequestDispatcher("/servlets/bookItems?bookId=18871");
  赫赫,在 getRequestDispatcher的同時(shí)還可以往 request當(dāng)中塞一個(gè)parameter啊.
  而response.sendRirect(new_url)呢, 這個(gè)new_url可是會(huì)返回給client browser看的,所以
  當(dāng)然是response.sendRedirect(new_url)了.
 
 
Servlet中forward和redirect的區(qū)別
 

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ì)有些問題了。    forward 會(huì)將 request state , bean 等等信息帶往下一個(gè) jsp
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>
       <head>
              <title>test</title>
       </head>
       <body>
              <jsp:forward page="forwardTo.jsp">
                     <jsp:param name="userName" value="riso"/>
              </jsp:forward>
       </body>
</html>

forwardTo.jsp

<%@ page contentType="text/html;charset=gb2312" %>
<!--forwardTo.jsp-->

<%
       String useName=request.getParameter("userName");
       String outStr= "謝謝光臨!";
       outStr+=useName;
       out.println(outStr);
%>

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     request.getRequestDispatcher( “/ooo “);
rd.forward(request,   response);提交至http://localhost:8080/Test/ooo
RequestDispatcher   rd     getServletContext().getRequestDispatcher( “/ooo “);
rd.forward(request,   response);提交至http://localhost:8080/Test/ooo
RequestDispatcher   rd   =getServletContext().getNamedDispatcher( “TestServlet “);(TestServlet為一個(gè) <servlet-name> )
rd.forward(request,   response);提交至名為TestServlet的servlet
如果在 <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   page= “OtherPage.jsp “/> 在JSP頁面被解析后轉(zhuǎn)換成pageContext.forward( “OtherPage.jsp [...]

 

--------------------------------------------------------------------------------------------------

清空當(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.println("test");
    //out.flush();
}
%>

如果沒有移開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
......

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
jsp重定向forward和sendRedirect的比較
response.sendRedirect(location)與rd.forward()區(qū)別
response.sendRedirect()與request.getRequestDispatcher().forward()區(qū)別
JSP Forward與Redirect 區(qū)別
forward和redirect
重定向和轉(zhuǎn)發(fā)的區(qū)別
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服