欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
jsp/servlet中 forward, include, reDirect 之間的區別
討論它們的區別之前,先讓我們看下它們是怎樣被調用的?
 
Response.sendRedirect(redirect)
redirect="AccessGoalCharts.jsp?rcatID=3&rhaID=All_&doSearch=true”
實(shí)際上,container會(huì )將這個(gè) redirect的 url字符串重新送到
Browser interface,相當于用戶(hù)重新在address欄中輸入了一個(gè)地址,赫赫,
這樣解釋簡(jiǎn)單吧?
 
request.getRequestDispatcher("welcome.jsp").forward(request, response);
我們查一下web.xml,如果我們沒(méi)有找到相應的servlet  mapping,那么這套
Request和response(也就是原來(lái)的browse interface)就被轉到 welcome.jsp
去處理了,welcome.jsp產(chǎn)生的html page也就被返回到了 response(也就是原來(lái)的browser interface).如果在web.xml當中我們找到了相應的 servlet mapping, 如下所示,
 <servlet-mapping>
    <servlet-name>DemoServlet</servlet-name>
    <url-pattern>/welcome.jsp</url-pattern>
 </servlet-mapping>
那么這套request和response就被forward到了DemoServlet的 doGet或者 doPost去處理了,問(wèn)題是,getRequestDispatcher為什么不改名字叫做 getURLDispatcher,這不是更加符合 由 web.xml控制的實(shí)際情況嗎?
 
Request.getRequestDispatcher(“welcome.jsp”).include(request,response)和 forward(request,response)的情況一模一樣,區別在于,這個(gè)response,也就是 Browse Interface在接收了welcome.jsp產(chǎn)生的html page以后(假設在 web,xml當中沒(méi)有相對應于 welcome.jsp的 servlet-mapping),還可以在這個(gè)response( browser interface)當中接收其他的html page,我測試過(guò)的代碼如下所示:
            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對于 用戶(hù)來(lái)講是透明的,而 reDirect對于用戶(hù)來(lái)講是 在browser的地址欄中可見(jiàn)的講法,都是正確的講法.
 
 
好,我再用通俗的講法講解一下 sendRedirct, forward, include的區別 (基于 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,我現在已經(jīng)處理完了你的request,
  你應該進(jìn)入這個(gè)URL,它會(huì )處理你的request了(這個(gè)request的內容您這個(gè)client可能就不太清楚了)
  (2)requestDispatcher.forward(request, response)
  現在的servlet把控制權完全交給另外一個(gè)Servlet,這個(gè)servlet已經(jīng)預先處理過(guò)的request和response也一并移交過(guò)去,
  這個(gè)forward的過(guò)程實(shí)際上Client并不知道,是Server端的幾個(gè)servlet collaboration.
  (3)include又和 forward有什么區別呢?
  赫赫, requestDispatcher.include(request, response)
  好像沒(méi)有什么區別啊,include僅僅是include, 接收request的那個(gè)servlet (called servlet),它往printerWriter(或OutputStream,   writer是寫(xiě)文本
  而stream是寫(xiě)二進(jìn)制)中寫(xiě)的內容是 caller servlet往 printerWriter(或 outputStream)中寫(xiě)的內容的一部分.而  
  requestDispatcher.forward(request, response)就不一樣了,calling servlet控制權完全交出去了, calling servlet
  的response buffer中的東西都被清空了,所以如果你要 forward,就是轉移控制權的話(huà), 你根本就不應該在calling servlet
  中的response里面寫(xiě)任何東西,寫(xiě)了的話(huà)一旦 forward的話(huà)也就白瞎了,因為被清空了嘛.
  (4)為什么 request.getRequestDispatcher 而 response.sendRedirect(new_url)呢?
  我舉個(gè)簡(jiǎn)單的例子,    request.getRequestDispatcher("/servlets/bookItems?bookId=18871");
  赫赫,在 getRequestDispatcher的同時(shí)還可以往 request當中塞一個(gè)parameter啊.
  而response.sendRirect(new_url)呢, 這個(gè)new_url可是會(huì )返回給client browser看的,所以
  當然是response.sendRedirect(new_url)了.
 
 
Servlet中forward和redirect的區別
 

forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response);     
redirect方式:response.sendRedirect("/somePage.jsp");
forward是服務(wù)器內部重定向,程序收到請求后重新定向到另一個(gè)程序,客戶(hù)機并不知道;redirect則是服務(wù)器收到請求后發(fā)送一個(gè)狀態(tài)頭給客戶(hù),客戶(hù)將再請求一次,這里多了兩次網(wǎng)絡(luò )通信的來(lái)往。當然forward也有缺點(diǎn),就是forward的頁(yè)面的路徑如果是相對路徑就會(huì )有些問(wèn)題了。    forward 會(huì )將 request state , bean 等等信息帶往下一個(gè) jsp
redirect 是送到 client 端后再一次 request , 所以資料不被保留.
使用 forward 你就可以用 getAttribute() 來(lái)取的前一個(gè) jsp 所放入的 bean 等等資料

在網(wǎng)上看到一些帖子,總結了一些區別,可以從以下幾個(gè)方面來(lái)看:

1.從地址欄顯示來(lái)說(shuō)

forward是服務(wù)器請求資源,服務(wù)器直接訪(fǎng)問(wèn)目標地址的URL,把那個(gè)URL的響應內容讀取過(guò)來(lái),然后把這些內容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內容從哪里來(lái)的,所以它的地址欄還是原來(lái)的地址.

redirect是服務(wù)端根據邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請求那個(gè)地址.所以地址欄顯示的是新的URL.所以redirect等于客戶(hù)端向服務(wù)器端發(fā)出兩次request,同時(shí)也接受兩次response。

2.從數據共享來(lái)說(shuō)

forward:轉發(fā)頁(yè)面和轉發(fā)到的頁(yè)面可以共享request里面的數據.
redirect:不能共享數據.

redirect不僅可以重定向到當前應用程序的其他資源,還可以重定向到同一個(gè)站點(diǎn)上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點(diǎn)的資源.

forward,方法只能在同一個(gè)Web應用程序內的資源之間轉發(fā)請求.forward 是服務(wù)器內部的一種操作.
redirect 是服務(wù)器通知客戶(hù)端,讓客戶(hù)端重新發(fā)起請求.

所以,你可以說(shuō) redirect 是一種間接的請求, 但是你不能說(shuō)"一個(gè)請求是屬于forward還是redirect "


3.從運用地方來(lái)說(shuō)

forward:一般用于用戶(hù)登陸的時(shí)候,根據角色轉發(fā)到相應的模塊.

redirect:一般用于用戶(hù)注銷(xiāo)登陸時(shí)返回主頁(yè)面和跳轉到其它的網(wǎng)站等.

4.從效率來(lái)說(shuō)
forward:高.
redirect:低.

5.jsp 語(yǔ)法

<jsp:forward page={"relativeurl" | "<%= expression %>"} />

或者這樣寫(xiě):

<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>標簽從一個(gè)jsp文件向另一個(gè)文件傳遞一個(gè)包含用戶(hù)請求的request對象.<jsp:forward>標簽以下的代碼,將不能執行.


你能夠向目標文件傳送參數和值,在這個(gè)例子中我們傳遞的參數名為username,值為scott,如果你使用了<jsp:param>標簽的話(huà),目標文件必須是一個(gè)動(dòng)態(tài)的文件,能夠處理參數.


如果你使用了非緩沖輸出的話(huà),那么使用<jsp:forward>時(shí)就要小心。
如果在你使用<jsp:forward>之前,jsp文件已經(jīng)有了數據,那么文件執行就會(huì )出錯.

屬性

page="{relativeurl | <%= expression %>}"
這里是一個(gè)表達式或是一個(gè)字符串用于說(shuō)明你將要定向的文件或url.這個(gè)文件可以是jsp,程序段,或者其它能夠處理request對象的文件(如asp,cgi,php).

<jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+
向一個(gè)動(dòng)態(tài)文件發(fā)送一個(gè)或多個(gè)參數,這個(gè)文件一定是動(dòng)態(tài)文件.

如果你想傳遞多個(gè)參數,你可以在一個(gè)jsp文件中使用多個(gè)<jsp:param>。name指定參數名,value指定參數值.

<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 通過(guò)XXX\index.jsp?name=gauss&pwd=123訪(fǎng)問(wèn)index.jsp,而index.jsp中有< jsp:forward page="login.jsp"/>,則在login.jsp中可以通過(guò)request.getParameter()得到name和pwd,而<%response.sendRedirect("login.jsp");%>得不到。

 

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

 

在Java Web開(kāi)發(fā)中,經(jīng)常會(huì )用到跳轉頁(yè)面的方法,一般有下面兩種方法。
Java代碼
HttpServletResponse response = new HttpServletResponse(); 
response.sendRedirect(location);
RequestDispatcher rd = new RequestDispatcher(); 
rd.forward(request, response);
跳轉方式
http://localhost:8080/Test應用
運用forward方法只能重定向到同一個(gè)Web應用程序中的一個(gè)資源。而sendRedirect方法可以讓你重定向到任何URL。
表單form的action= “/uu “;sendRedirect( “/uu “);表示相對于服務(wù)器根路徑。如http://localhost:8080/Test應用(則提交至http://localhost:8080/uu);
Forward代碼中的 “/uu “則代表相對與WEB應用的路徑。如http://localhost:8080/Test應用(則提交至http://localhost:8080/Test/uu);
(運用RequestDispatcher接口的Forward)方法
forward()無(wú)法重定向至有frame的jsp文件,可以重定向至有frame的html文件,
同時(shí)forward()無(wú)法在后面帶參數傳遞,比如servlet?name=frank,這樣不行,可以程序內通過(guò)response.setAttribute( “name “,name)來(lái)傳至下一個(gè)頁(yè)面.
重定向后瀏覽器地址欄URL不變.
只有在客戶(hù)端沒(méi)有輸出時(shí)才可以調用forward方法。如果當前頁(yè)面的緩沖區(buffer)不是空的,那么你在調用forward方法前必須先清空緩沖區。
“/ “代表相對與web應用路徑
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);提交至名為T(mén)estServlet的servlet
如果在 <jsp:forward> 之前有很多輸出,前面的輸出已使緩沖區滿(mǎn),將自動(dòng)輸出到客戶(hù)端,那么該語(yǔ)句將不起作用,這一點(diǎn)應該特別注意。
另外要注意:它不能改變?yōu)g覽器地址,刷新的話(huà)會(huì )導致重復提交
從http://localhost:8080/Test/gw/page.jsp中轉發(fā)
<jsp:forward   page= “OtherPage.jsp “/> 在JSP頁(yè)面被解析后轉換成pageContext.forward( “OtherPage.jsp [...]

 

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

清空當前緩存:

在之前撰寫(xiě)JSP的例子中,實(shí)用了out這個(gè)對象,這個(gè)對象您不用事先宣告,就可以在JSP網(wǎng)頁(yè)中使用,這是JSP所提供的隱含對象

(Implicit Object),在轉譯為Servlet之后,out會(huì )轉換為對應于javax.servlet.jsp.JspWriter型態(tài)的對象。

JspWriter直接繼承自java.io.Writer,您可以使用println()、print()方法將指定的數據以字符的方式傳送至客戶(hù)端,println()會(huì )

在送出數據之后進(jìn)行換行,而print()則否,注意換行指的是在HTML原始碼中設定換行字符,而不是輸出<br>標簽使得在網(wǎng)頁(yè)中可以

換行。

out(JspWriter)具有緩沖區功能,HTTP的特性是為了要取得一份資源,就進(jìn)行一份協(xié)議溝通,如果資源數目很多(例如一份HTML文件

還包括了許多的小圖片),而每份資源的容量實(shí)際上很小,那么為了要取得完整的資源,將會(huì )花費很多通訊在協(xié)議往來(lái)上,假設如果

out(JspWriter)不具有緩沖功能,則每一次out.println(),就會(huì )直接將數據送出至客戶(hù)端,那么單要完成一個(gè)完整網(wǎng)頁(yè)的傳送,就

會(huì )花費不少的網(wǎng)絡(luò )資源,每一個(gè)JSP網(wǎng)頁(yè)預設上都會(huì )具有緩沖,您可以使用page指令元素的autoFlush屬性來(lái)設定是否使用緩沖區功能

。

在Tomcat5上,預設為每一個(gè)JSP網(wǎng)頁(yè)備有8192字節的緩沖區(您可以使用page指令元素的buffer屬性來(lái)自緩沖區的大小),在緩沖區還

沒(méi)有滿(mǎn)之前,數據不會(huì )真正被送出至客戶(hù)端,在這之前,您還有機會(huì )重設送出的數據,如果緩沖區滿(mǎn)了,數據將會(huì )被清出并送至客戶(hù)

端,可以使用下面這個(gè)程序來(lái)示范:

buffer.jsp
<%@page contentType="text/html;charset=Big5"%>
<%
out.println("預設緩沖區大?。? + out.getBufferSize() + "<br>");
out.flush();
//下面的文字不會(huì )出現在客戶(hù)端
out.println("您看的到這段文字嗎?");
out.clearBuffer();
out.println("這段您可以看到!");
%>

您可以使用flush()直接清出緩沖區的內容,而clearBuffer()會(huì )將緩沖區的內容清除,所以第二段文字不會(huì )出現在客戶(hù)端的網(wǎng)頁(yè)上,

而最后一段會(huì )整個(gè)JSP網(wǎng)頁(yè)執行完整后自動(dòng)送出至客戶(hù)端,執行結果如下:

預設緩沖區大?。?192

這段您可以看到!

您可以使用page指令元素的autoFlush來(lái)設定JSP頁(yè)面是否使用緩沖區自動(dòng)清出功能,out(JspWriter)以一種方式與

HttpServletResponse的PrintWriter建立關(guān)系,兩者之間的行為關(guān)系取決于是否使用緩沖區自動(dòng)清出,如果使用緩沖區自動(dòng)清出,則

在緩沖區滿(mǎn)之前,或是使用flush()之前不會(huì )建立PrintWriter對象來(lái)對客戶(hù)端進(jìn)行輸出,如果不使用緩沖區自動(dòng)清出,則寫(xiě)入out

(JspWriter)對象的數據會(huì )直接寫(xiě)入PrintWriter對象,然后在指定flush()之后輸出至客戶(hù)端。

如果您將autoFlush設定為false,則您必須明確的使用flush()來(lái)輸出數據,否則緩沖區滿(mǎn)了的話(huà),就會(huì )發(fā)生IOException例外,使用

緩沖區有其好處,但由于緩沖區在滿(mǎn)之前,數據并不會(huì )真正送出客戶(hù)端,所以會(huì )有響應延遲的問(wèn)題,如果您要實(shí)時(shí)性將結果響應至客

戶(hù)端,則可以關(guān)閉緩沖區。

下面這個(gè)程序測試緩沖區關(guān)閉之后,如果緩沖區滿(mǎn)了,會(huì )有什么結果:

buffer.jsp
<%@page contentType="text/html;charset=Big5" %>
<%
for(int i=0; i<2000; i++){
    out.println("test");
    //out.flush();
}
%>

如果沒(méi)有移開(kāi)out.flush()的批注符號,則會(huì )響應一下的錯誤訊息:
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
......

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

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久