




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
轉發重定向例子【篇一:轉發重定向例子】httpservletresponse對象的sendredirect(java.lang.stringlocation)方法稱作重定向。如果location地址前面加上/,則表示相對于servlet容器的根來請求,比如;如果location地址前面沒有加上/,則表示相對于當前請求的uri來尋找地址。requestdispatcher的:forward(servletrequestrequest,servletresponseresponse)方法叫做請求轉發。實驗例子1:重定向和請求轉發似乎都是造成頁面跳轉第一個頁面first.jsp:%@pagelanguage=javaimport=java.util.*pageencoding=utf-8%stringpath=request.getcontextpath();stringbasepath=request.getscheme()+://+request.getservername()+:+request.getserverport()+path+/;!doctypehtmlpublic-//w3c//dtdhtml4.01transitional//enhtmlheadbasehref=%=basepath%titlemyjspfirst.jspstartingpage/titlemetahttp-equiv=pragmacontent=no-cachemetahttp-equiv=cache-controlcontent=no-cachemetahttp-equiv=expirescontent=0metahttp-equiv=keywordscontent=keyword1,keyword2,keyword3metahttp-equiv=descriptioncontent=thisismypagelinkrel=stylesheettype=text/csshref=styles.css/headbodyformaction=secondinputtype=textname=usernameinputtype=submitvalue=submit/form/body/htmlfirst.jsp第二個頁面是servlet:用請求轉發:packagecom.shengqishiwind.servlet;importjava.io.ioexception;importjavax.servlet.requestdispatcher;importjavax.servlet.servletexception;importjavax.servlet.http.httpservlet;importjavax.servlet.http.httpservletrequest;importjavax.servlet.http.httpservletresponse;publicclasssecondextendshttpservletpublicvoiddoget(httpservletrequestrequest,httpservletresponseresponse)throwsservletexception,ioexceptionprocess(request,response);publicvoiddopost(httpservletrequestrequest,httpservletresponseresponse)throwsservletexception,ioexceptionprocess(request,response);privatevoidprocess(httpservletrequestrequest,httpservletresponseresponse)throwsservletexception,ioexception//請求轉發requestdispatcherrd=request.getrequestdispatcher(third.jsp);rd.forward(request,response);}用重定向,則把處理方法改為:privatevoidprocess(httpservletrequestrequest,httpservletresponseresponse)throwsservletexception,ioexception//重定向response.sendredirect(third.jsp);}第三個頁面是third.jsp%@pagelanguage=javaimport=java.util.*pageencoding=utf-8%stringpath=request.getcontextpath();stringbasepath=request.getscheme()+://+request.getservername()+:+request.getserverport()+path+/;!doctypehtmlpublic-//w3c//dtdhtml4.01transitional//enhtmlheadbasehref=%=basepath%titlemyjspthird.jspstartingpage/titlemetahttp-equiv=pragmacontent=no-cachemetahttp-equiv=cache-controlcontent=no-cachemetahttp-equiv=expirescontent=0metahttp-equiv=keywordscontent=keyword1,keyword2,keyword3metahttp-equiv=descriptioncontent=thisismypagelinkrel=stylesheettype=text/csshref=styles.css/headbodythisismythirdpage.br/body/html不管用請求轉發還是重定向的方法,第一個頁面點擊提交后,都能順利轉到第三個頁面:但是其實實際進行的操作還是很不同的,看下面的例子。實驗例子2:如果要在第三個頁面中取得第一個頁面輸入的用戶名請求轉發的實現比較簡單,第二個頁面的servlet代碼不用添加任何東西,可以直接從第三個頁面getparameter,即把third.jsp中的body改為:bodythisismythirdpage.br用戶名:%=request.getparameter(username)%/body則在第一個頁面輸入shengqishiwind,提交后,第三個頁面顯示:重定向應該怎么實現獲取第一個頁面提交的用戶名呢?第三個頁面采用如上的代碼(通過getparameter獲取參數),把第二個頁面中改為重定向的跳轉方式,重新來一次,可以看到顯示:再嘗試第二個頁面這樣(通過setattribute存儲值):privatevoidprocess(httpservletrequestrequest,httpservletresponseresponse)throwsservletexception,ioexceptionstringusername=request.getparameter(username);//重定向request.setattribute(username,username);response.sendredirect(third.jsp);}然后第三個頁面這樣獲取:用戶名:%=request.getattribute(username)%仍然是不行,得到的仍然是null值。重定向和請求轉發的區別請求轉發:requestdispatcher是通過調用httpservletrequest對象的getrequestdispatcher()方法得到的,是屬于請求對象的方法。請求轉發,整個過程處于同一個請求當中。不管經歷了多少組件,都可以從request中直接取得想要的值。使用請求轉發時,到結果頁面的網址是:重定向:sendredirect()是httpservletresponse對象的方法,即響應對象的方法。既然調用了響應對象的方法,那就表明整個請求過程已經結束了,服務器開始向客戶端返回執行的結果。sendredirect調用后會向客戶端返回一個響應,這個響應告訴客戶端要轉向的頁面,緊接著客戶端又會發送一個新的請求,轉向這個目標頁面。也即是說,重定向的過程中實際上客戶端會向服務器發送兩個請求。使用重定向時,結果頁面的網址是:說明客戶端已經知道了結果頁面的地址,是重新發送的全新的請求。重定向方式在firebug中的圖:總結記憶:請求轉發只有一個請求,所以勇往直前,調用的方法叫forward;而重定向需要客戶端重新發送請求,調用的是sendredirect,名字里有個re,表示重復。參考資料:圣思園張龍老師視頻教程。javadocumentapiwithexamples:【篇二:轉發重定向例子】重定向和轉發的區別范文一:.上服為器發送務02響3應中分部內容.說見下明:審視I(caoton響應首部你i發現服務器通將知了戶新客的求應該指向哪個請ulr任何附,在加來原請求之上的url參數都,會出現新的在求請中,當瀏覽器出新的發請求,這時參數也會跟些發著送去,出是參數值只為nlu,l這因為當瀏是覽器發送新的請求前時一求請以中“請求屬性存“儲的對都將消象)失客端戶瀏器接覽受到3此2響0后應刻再發立送個一新h的tpt請到服求務端器服務,接受此器求請后找尋客戶請求資并發源送到戶客端如。重定此的整向個過就程部全完。而進成行轉發時目標頁,面是過通jp容器的一s內部方個調用加法調以的(并用像重非向定通兩次請過求處理),頁新繼續面處理一同求請。2)使用差異重向定:以的前rqueet中存放的s變量全部失,并效入一進新的個equret作用域s。度較轉發慢速轉:發以的前eruesq中存放的變量不會t效,失兩頁面個享共同一個reueqst作用域除特。幾個采殊重用向方式定的動作外般默一為認發方式發注轉事意項:如在果sp頁j面使用相中對徑來指向圖象文件或其路他源資,轉發就能可出現會錯。誤因為瀏器覽并知不轉道已經發生發,對路相徑的頭源依是最初的然sevrle而非以轉t發j的s。p例如:目錄/a?ajsp目b錄/b.jps目錄/bcp?gn假設aj.sp過轉發通用b調.spj而b,.sp頁j中面用相對使路調徑c用png.象文件,則服務器肯圖定報錯會因為瀏覽,并不知器道發轉已發生經仍,然處錯認的c■為npg件文相的對路的源徑頭a是?jp所在s目而錄非b.sp所在目j。錄但定向重就不成在這樣的題問。故般使用絕對路徑一范文五:轉發與重定向的區別我們知道,請求轉發和請求包含都是在一個請求內,涉及到多個servlet。既然轉發和包含都在一個請求內,那么說明多個servlet共用同一個request對象和response對象。這個時候就存在request域。1.request域servlet的三大域對象:request,session,application。其中request域是三大域對象中范圍最小的域對象,application對象其實就是servletcontext對象,在servletcontext功能詳解中我們對它的域功能做了詳細的介紹;session域會在后面學習。request域只會在請求轉發和請求包含時存在。它的域范圍就是整個請求鏈,如圖1-1所示。例如:由aservlet請求轉發到bservlet,這時在aservlet中向request域中存放數據,然后在bservlet中從request域中獲取數據。如果bservlet又轉發給其他的servlet,那么在其他servlet中也可以從request域中獲取數據。轉發過程中經過的這些servlet都在一個請求鏈中。圖1-1請求轉發2.request域相關方法介紹以后只要是域對象,那么它必然會有以下三個方法:??voidsetattribute(stringname,objectvalue)該方法是向域中保存域屬性,例如:setattribute(“username”,”zhangsan,其中,username是域屬性的名稱,zhangsan是域屬性的值。如果多次調用該方法,且屬性名稱相同,那么后保存的數據會覆蓋先保存的數據。??objectgetattribute(stringname)該方法是根據屬性名稱從域中獲取域屬性的值,如果之前沒有調用setattribute()方法保存數據,那么調用getattributeO方法返回值是null。??voidremoveattribute(stringname)該方法是從域中移出指定名稱的域屬性,如果該名字的域屬性不存在,則該方法什么都不做。域屬性和請求參數的區別很多人在學習域屬性的時候會將域屬性和請求參數弄混淆,認為域屬性就是請求參數。其實這個認知是錯誤的。下面我們來看域屬性和請求參數有哪些區別:(1)來源不同請求參數是由客戶端發送給服務器的,而域屬性是在服務器內部,在servlet中向域中添加的;相關方法不同請求參數只能獲取,不能修改、刪除和添加,而域屬性在獲取的基礎上還可以添加和刪除。為了讓大家更加直觀的區分它們,下面我們來看一張圖,圖1-2:圖1-2請求參數和域屬性的區別由圖1-2可知,域屬性是請求轉發或請求包含時,在servlet之間傳遞的數據。請求轉發和重定向的區別在學習時,我們已經了解了重定向的一些特點,現在根據請求轉發的特性,我們將請求轉發和重定向做了以下比較:請求轉發是一次請求一次響應,而重定向是兩次請求兩次響應;請求轉發地址欄不會改變,而重定向地址欄會顯示第二次請求的地址;請求轉發只能轉發給本項目的其他資源,而重定向不僅可以重定向到本項目的其他資源,還可以重定向到其他項目;請求轉發是服務器端的行為,轉發時只需要給出轉發的資源路徑即可,如servlet的訪問路徑;而重定向需要給出全路徑,即路徑要包含項目名;請求轉發比重定向的效率高,因為請求轉發是一個請求。在以后的開發中,如果需要地址欄的地址發生改變,就選擇重定向;如果需要在servlet之間通過request域進行數據通信,就選擇請求轉發。下面通過一個案例來了解request域屬性的設置和獲取,如下所示(1)創建web應用,examplell,在該應用下新建一個servlet類,firstservlet,主要代碼如例1-1所示:例1-1firstservlet.javapublicclassfirstservletextendshttpservlet{publicvoiddoget(httpservletrequestrequest,httpservletresponseresponse)throwsservletexception,ioexception{system.out.println(firstservlet...);request.setattribute(username,zhangsan);request.getrequestdispatcher(/secondservlet).forward(request,response);}}例1-1中,先在控制臺打印“firstservlet…”,然后向request域中添加域屬性,最后再進行轉發。需要注意的是,添加域屬性的代碼不能放在轉發代碼的后面,否則在secondservlet中將會獲取不到域屬性。⑵再次新建一個servlet類,secondservlet,主要代碼如例1-2所示:例1-2secondservlet.javapublicclasssecondservletextendshttpservlet{publicvoiddoget(httpservletrequestrequest,httpservletresponseresponse)throwsservletexception,ioexception{system.out.println(secondservlet...);system.out.println(request.getattribute(username));}}例1-2中,先在控制臺上打印“secondservlet…”,再打印從域中取出的域屬性的值。(3)firstservlet在web?xml中的訪問路徑配置為:“/firstservlet”;secondservlet在web.xml中的訪問路徑配置為:“/secondservlet”。⑷將example11發布到tomcat中,然后啟動服務器,在瀏覽器地址欄上輸入:http://localhost:8O80/example11/firstservlet,控制臺打印結果如圖1-3所示:圖1-3控制臺打印結果request域在請求轉發和請求包含時存在,因為轉發和包含都是在同一個請求中,而重定向是兩個請求,當我們在第一個請求中,往request域中存放數據,當發送第二次請求時,服務器又會創建一個新的request對象,由于第一個request對象就已經死亡,所以它里面的域屬性自然也就不存在了。范文六:轉發與重定向的區別轉發方式:request?getrequestdispatcher()?forward();重定向方式:response.sendredirect();下面是httpservletresponse.sendredirect方法實現的請求重定向與requestdispatcher.forward方法實現的請求轉發的總結比較:(1)requestdispatcher.forward方法只能將請求轉發給同一個web應用中的組件;而httpservletresponse.sendredirect方法不僅可以重定向到當前應用程序中的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對url重定向到其他站點的資源。如果傳遞給httpservletresponse?sendredirect方法的相對url以“/”開頭,它是相對于整個web站點的根目錄;如果創建requestdispatcher對象時指定的相對url以“/”開頭,它是相對于當前web應用程序的根目錄。(2)調用httpservletresponse.sendredirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的url會發生改變,由初始的url地址變成重定向的目標url;而調用requestdispatcher.forward方法的請求轉發過程結束后,瀏覽器地址欄保持初始的url地址不變。(3) httpservletresponse.sendredirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個url的訪問請求,這個過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢張三回信說沒有錢,讓“瀏覽器”去找李四借,并將李四現在的通信地址告訴給了“瀏覽器”。于是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”。可見,“瀏覽器”一共發出了兩封信和收到了兩次回復,“瀏覽器”也知道他借到的錢出自李四之手。requestdispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求并得到了響應結果,并不知道在服務器程序內部發生了轉發行為。這個過程好比綽號叫“瀏覽器”的人寫信找張三借錢,張三沒有錢,于是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只發出了一封信和收到了一次回復,他只知道從張三那里借到了錢,并不知道有一部分錢出自李四之手。(4) requestdispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而httpservletresponse.sendredirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。對于同一個web應用程序的內部資源之間的跳轉,特別是跳轉之前要對請求進行一些前期預處理,并要使用httpservletrequest.setattribute方法傳遞預處理結果,那就應該使用requestdispatcher.forward方法。不同web應用程序之間的重定向,特別是要重定向到另外一個web站點上的資源的情況,都應該使用httpservletresponse.sendredirect方法。(5)無論是requestdispatcher.forward方法,還是httpservletresponse.sendredirect方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中清除。怎么選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的對象,所以他是第一選擇。但是由于在轉發之后,瀏覽器中url仍然指向開始頁面,此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇轉發。不要僅僅為了把變量傳到下一個頁面而使用session作用域,那會無故增大變量的作用域,轉發也許可以幫助你解決這個問題。重定向:以前的request中存放的變量全部失效,并進入一個新的request作用域。轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。轉發與重定向的區別轉發方式:request?getrequestdispatcher()forwardO;重定向方式:response.sendredirect();下面是httpservletresponse.sendredirect方法實現的請求重定向與requestdispatcher.forward方法實現的請求轉發的總結比較:(1)requestdispatcher.forward方法只能將請求轉發給同一個web應用中的組件;而httpservletresponse.sendredirect方法不僅可以重定向到當前應用程序中的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對url重定向到其他站點的資源。如果傳遞給httpservletresponse.sendredirect方法的相對url以“/”開頭,它是相對于整個web站點的根目錄;如果創建requestdispatcher對象時指定的相對url以“/”開頭,它是相對于當前web應用程序的根目錄。(2)調用httpservletresponse.sendredirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的url會發生改變,由初始的url地址變成重定向的目標url;而調用requestdispatcher.forward方法的請求轉發過程結束后,瀏覽器地址欄保持初始的url地址不變。(3)httpservletresponse.sendredirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個url的訪問請求,這個過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢,張三回信說沒有錢,讓“瀏覽器”去找李四借,并將李四現在的通信地址告訴給了“瀏覽器”。于是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”。可見,“瀏覽器”一共發出了兩封信和收到了兩次回復,“瀏覽器”也知道他借到的錢出自李四之手。requestdispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求并得到了響應結果,并不知道在服務器程序內部發生了轉發行為。這個過程好比綽號叫“瀏覽器”的人寫信找張三借錢,張三沒有錢,于是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只發出了一封信和收到了一次回復,他只知道從張三那里借到了錢,并不知道有一部分錢出自李四之手。(4) requestdispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而httpservletresponse.sendredirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。對于同一個web應用程序的內部資源之間的跳轉,特別是跳轉之前要對請求進行一些前期預處理,并要使用httpservletrequest.setattribute方法傳遞預處理結果,那就應該使用requestdispatcher.forward方法。不同web應用程序之間的重定向,特別是要重定向到另外一個web站點上的資源的情況,都應該使用httpservletresponse.sendredirect方法。(5) 無論是requestdispatcher.forward方法,還是httpservletresponse.sendredirect方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中清除。怎么選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的對象,所以他是第一選擇。但是由于在轉發之后,瀏覽器中url仍然指向開始頁面,此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇轉發。不要僅僅為了把變量傳到下一個頁面而使用session作用域,那會無故增大變量的作用域,轉發也許可以幫助你解決這個問題。重定向:以前的request中存放的變量全部失效,并進入一個新的request作用域。轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。范文七:1.equertsisdatpcherf?rwoad()—r—發轉是在務服器起端用作,使當用frwaodOr,時ervsletneign傳遞ehtp請t從求前當的srvletoejrs到p外一個另srvlet,jsep普通或hmlt文件也,即你的ofrm交提至ajs■,在p?asjp用到了ofrward(重)定至b向j?p,此時sofm提r交的有所信息在?bsjp都以獲可得參,數動傳自遞.但froardw)無法重定向至(f有rmae的sj文p,可件以重向至定fr有maeh的ml文t件,時同ofwarr()無法在d后帶參面數傳遞比,servl如e?tamn=ferank這,不行,樣可以程序內過通resopse.snetttaibrtuen(ma,neae)m傳至下一來個頁.面轉發瀏后器覽址地u欄lr不變例:在.ersvlte進中重定向行uplibcvodidpostoh(tpstreveltrquesetreueqs,htttserpvlerteposserenpsone)shrotwsservletexepciotnioexc,etipno{respnos.esecottennttpyete(txht/m;lcarhset=b231g2;)ervlsetoncetxtcs=getservletontcxet();rqeustdiseptacerhrd=nlul;rd=csget.eqruetdispsacthe(r/iden.jxps;)//定的向頁面r.dorwarfd(rqeeut,rsseposen);通}常在ervsetl中使,用不在jp中使用s。2.esropne.ssnerdeidertc) (重向定是用在的戶瀏器覽端工作se,drndieerct(可以帶參數)傳遞,如s比evrelt?anm=frena傳至k下個面頁,時它同可以重定至不同向的機上,sendre主idrct()e以重定可有f向rame的.sjp件.重定向文在瀏后器地覽欄址上會現出重向定面的頁url例在:esvretl重中向定pblucioidvdpoot(httspsrevelretqeusretuqet,hsttspreletvrepsosneerspnso)ethrowssevrlteexcetion,pioxceptione{respose.nstceonenttypt(teext/tml;hchaser=gbt3212);rspenseos.enrddereitc(/ndie.xsjp);}由于repossenj是ps面中的隱含頁象,對在js故p頁面可中用re以possnes.ndrederietcO直接現實定重。位由于resopnesj是s頁面p的中含隱對,象故在sj頁面p可以用中rspeons.seenrdderietc()接直實現定位。重意注:(1)使用.resonpe.ssndreeirdcte,前時面能有不html輸。出并這不是對的絕不能,有hmt輸出I其實指不是能有tml被送到了瀏覽器h事實。現上的s在evrer都有ccha機制e一在8k般我是說(jpservsre,這)意味就著除非,你關閉c了chea或者,使你了用ut.olfus()h強制刷,那新么在使sen用reddriet之前,有c少量的htm輸出l是也許的允。⑵r.sepones.endresdrect之i后,應該跟緊一ret句un;r我們經已知re道spnos.esednerdiect是通過r覽瀏來做轉向的器以只有在所面頁理處成后,才完會實際的有動。作既然已你經做轉向了,要么后的輸那出有還什么意義呢而?且有可能因為會面的后輸導致轉向出敗失。比:較0?1eqrustedspiatcer.hofrardw)(容器是中控權制的轉向在客戶,端瀏器覽地欄址中不會示顯出向轉后地的;址0-r2esonpses.nerddieerct(則是完全)跳轉,的覽瀏將會得器跳到轉的地址,并重發送新請求接。鏈這樣從,覽器的瀏址欄中地可看以到轉后跳鏈接地址。的前者更加高效,在者前以可足需要滿,盡時量用使reuqstdesiapcteh-frowrrdO方注在有:情況些下,比,需要如跳轉到一其個服它器務上資源的則,須必用h使ttseprvltrespones.eendrsqueste()法方。3它的底層部是由r分equesdtspaicher來實t的,現因它帶有r此euqstedipascher.ftorwadr)(法的印記。方如果a前之很多輸有出前,的輸面已出緩使沖滿區,將自動輸出到客端戶,那該么句將語不作起用,一這點該應特別意。注另外要注意它不:能變瀏改覽器地址,新刷的話會導重復致交提.4修ht改tpheadr的loeatcino性屬重來向定過設置直通接改修址地來欄現實面頁的定重。jsp文向代件如下碼V%:respones.setsatus(htttpsrelvertspoeness.cm_veod_epmranenlt);sytrnignwelon=cn/ewath/psj.asjp;repsnoe.ssteeahdrelo(actin,oewlnoc);n>%5jsp中實現在.頁某停留若面干秒,后動重自定到另一向頁面htm在文件中,l面下代的:碼p的它含:義在5分鐘后正在瀏之覽頁面將會自動的變為trage.tthlm一頁。代這碼3中0為刷0新的延遲時間以,為秒位。單tareg.rthml為想轉你的向標目,若頁本為頁則自為刷新本頁。動由上可,知可通以s過teeadher實現來某頁停面若干留秒后,動重自定向另到一面頁。關鍵碼:代trsignontcents=tytiame+u;rl=+url;repsnseo.esheadetr(efrresh,cnoentt;)范文八:請求轉發和重定向的區別一、調用方式我們知道,在servlet中調用轉發、重定向的語句如下:request.getrequestdispatcher(new.jsp).forward(request,response);//轉發到new.jspresponse.sendredirect(new?jsp);〃重定向到new.jsp在jsp頁面中你也會看到通過下面的方式實現轉發:當然也可以在jsp頁面中實現重定向:二、本質區別解釋一一句話,轉發是服務器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個動作的工作流程:轉發過程:客戶瀏覽器發送http請求 》web服務器接受此請求--》調用內部的一個方法在容器內部完成請求處理和轉發動作 》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。重定向過程:客戶瀏覽器發送http請求一》web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器■■》客戶瀏覽器發現是302響應,貝咱動再發送一個新的http請求,請求url是新的location地址 》服務器根據此請求尋找資源并發送給客戶。在這里location可以重定向到任意url,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。解釋二重定向,其實是兩次request,第一次,客戶端requesta,服務器響應,并response回來,告訴瀏覽器,你應該去b。這個時候ie可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的信息會被丟失。例子:請求轉發是服務器內部把對一個request/response的處理權,移交給另外一個對于客戶端而言,它只知道自己最早請求的那個a,而不知道中間的b,甚至c、do傳輸的信息不會丟失。例子:解釋三假設你去辦理某個執照,重定向:你先去了a局,a局的人說:“這個事情不歸我們管,去b局”,然后,你就從a退了出來,自己乘車去了b局。轉發:你先去了a局,a局看了以后,知道這個事情其實應該b局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到后面辦公室聯系了b的人,讓他們辦好后,送了過來。三、請求重定向與請求轉發的比較盡管httpservletresponse.sendredirect方法和requestdispatcher.forward方法都可以讓瀏覽器獲得另外一個url所指向的資源,但兩者的內部運行機制有著很大的區別。下面是httpservletresponse.sendredirect方法實現的請求重定向與requestdispatcher.forward方法實現的請求轉發的總結比較:(1) requestdispatcher.forward方法只能將請求轉發給同一個web應用中的組件;而httpservletresponse.sendredirect方法不僅可以重定向到當前應用程序中的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對url重定向到其他站點的資源。如果傳遞給httpservletresponse.sendredirect方法的相對url以“/”開頭,它是相對于整個web站點的根目錄;如果創建requestdispatcher對象時指定的相對url以“/”開頭,它是相對于當前web應用程序的根目錄。(2) 調用httpservletresponse.sendredirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的url會發生改變,由初始的url地址變成重定向的目標url;而調用requestdispatcher.forward方法的請求轉發過程結束后,瀏覽器地址欄保持初始的url地址不變。(3)httpservletresponse.sendredirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個url的訪問請求,這個過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢張三回信說沒有錢,讓“瀏覽器”去找李四借,并將李四現在的通信地址告訴給了“瀏覽器”。于是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”。可見,“瀏覽器”一共發出了兩封信和收到了兩次回復,“瀏覽器”也知道他借到的錢出自李四之手。requestdispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求并得到了響應結果,并不知道在服務器程序內部發生了轉發行為。這個過程好比綽號叫“瀏覽器”的人寫信找張三借錢,張三沒有錢,于是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只發出了一封信和收到了一次回復,他只知道從張三那里借到了錢,并不知道有一部分錢出自李四之手。(4)requestdispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而httpservletresponse.sendredirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。對于同一個web應用程序的內部資源之間的跳轉,特別是跳轉之前要對請求進行一些前期預處理,并要使用httpservletrequest.setattribute方法傳遞預處理結果,那就應該使用requestdispatcher.forward方法。不同web應用程序之間的重定向,特別是要重定向到另外一個web站點上的資源的情況,都應該使用httpservletresponse.sendredirect方法。(5)無論是requestdispatcher.forward方法,還是httpservletresponse.sendredirect方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中清除。范文九:fowardr方法能只請將求發轉給一個同eb應用w中組件,的而esdnedirecr方法t不可以重定向到僅當應前程用序中的其資源他,還以重可向到定同一站個點上的其他應用序程的中資,源至甚以可使用對絕rl重u定向其他站到點的資源如果傳給遞ofrwrad法方相對url的”/”開頭,它以是對于相前w當eb用應序程根目錄;如果的遞給s傳edrenirecd方法的t對相rul”/以開頭,它是”相于整對w個b站e的點根目錄調f用rowra方d的請求轉法發過結束程,后覽瀏器址欄保持地始初u的rl地不變;址而調s用nededirertc方重定法的訪向過程問結后束瀏覽,器地址中顯示的欄rlu由初始的會url地變址成定向的目重標ulrofwrrda法的調用方者被調用和之間者享共相同requ的se對t和象espronse對,它象們于同屬一個訪問求請響應過程;而和endsredriect方調法者和用調用者被使用各自re的qesu對象和tresonsep象,屬對不于同訪問的求和請應響程過范文十:盡管htptesvretlresopsn.eendsredirect方和法requetsdsiapcterh.orwfadr方法可以讓瀏覽器獲都得另外一個url指向的所源資,兩但的內部者運行制有著很大機區的。別下面是ttphsrvletresponesese.nredidrcte方法實現的求請重定向r與questeidsptchar.feorard方法w實的現請轉發求的結總比較:(1r)queetdispaschtr.foreward法方只將能求轉發給同請個web一用應的組中;而件tthserpvetrelposns.eesdredinrec方法不僅t可重定向到當前以應程序中的用他其源資,可還以重向到定一同個站點上其的應用程序他中資源,的甚至使是絕對u用l重定r向到他其站的點資。源如傳遞果ht給ptsevrlertspoesn.eensdrdeiecrt方法相的u對r以1“”開/頭它是,相對整個w于e站b的根點目錄;如果創建rqeuetsidspatherc對象時指的定相url對“/以開”,它頭相是對當前于we應b程序用根目的錄。(用ht調ptsreletvreposne.sendresdircte方重法定的訪問過程結束后,向瀏器地覽址中欄示顯的ul會r發改生,變由始的url地初址成變重向的目定u標r;而調用leqrusetdisatpchreforw.rad法的方請求轉過發程束后,瀏結覽地器址保欄持初的始rul址地不變。htt(pervlstreesopnesse.ndreirecdt方對瀏法覽的器求請接直出響應,響應作的結就是果訴瀏覽器告去重發出新另外對一個ulr訪的請問求。舉個例:重子向定過好比程有個號綽“叫瀏覽器”的人寫信張三找借錢三張信回說有錢沒,讓瀏覽“器去”找李四,借將并李四在現的信通地址告訴了“瀏給覽器”。是于,瀏覽器”又按張三“提通信供地給址李四信借錢,寫李收四到后信把就匯給錢了“瀏器”覽。見可,瀏“器覽”共發一出了兩封和收信了兩次到回復“,覽器”也瀏知他道借的錢到出自四之手李。equesrdispttahcr.eofwarrd法在方服器務端部內將請求發轉另給一個外源,資瀏覽器只知發道出請求并了得了響應到果結,不知道并在服務器程內序部發了生轉發行為。這個程好比過號綽叫“瀏覽器”人的寫找信張三錢,張三沒借有錢于是,張三找四借李一了錢,甚至還可以些上加自的一些錢,然己后再這些錢將匯了“給覽瀏器”可。見“瀏覽器”,只發出了一封和信收到了次一復,回只他道知張從那里三到了錢借,不知并道一有部分出自李錢之四。手()4reqeutdsspiacthe.frorwrd方法a的用者調與調被用者間共享相同之re的uestq對象re和psose對n象它們,屬同一于訪個問求請響應過和程;ht而pstreletvespornse.sednedriert方c法用調與被調者者用使各用自的rqeesut對象和erpsnoes象,它們屬對于個兩獨的訪立請問求和應響程過。于對同個一wb應e程序用的部資內源之的間跳轉,特別是轉跳之前要對請求行進一些前預處期,理要并用使ttphersvltrequest.eesatttirubet法方傳遞預理結果處那,就應使該re用ueqtsdipstahcref.owrrda方。法不同ebw應用序之程的重間向定,別是要特重向定到另外一個wb站e上的點資的情源,都應該況使httpsrevleretpsonses.edredniecr方法t。(5無)論是eruqetsispdathec.frrowrda方法,還h是ttservlpteespornse.endrseirdect方法,調用它們之前,都不在有能容內已被實經際出輸到了客戶端如果緩。區沖中經已了一些有內,容些內這容將被從緩區沖清中。除atgjsp:jpservlstseerletv閱讀詳情:【篇三:轉發重定向例子】1.重定向訪問服務器兩次,轉發只訪問服務器一次。2■重定向可以看見目標頁面的url,轉發只能看見第一次訪問的頁面url,以后的工作都是有服務器來做的。3■重定向跳轉后必須加上return,要不然頁面雖然跳轉了,但是還會執行跳轉后面的語句,轉發是執行了跳轉頁面,下面的代碼就不會在執行了。4■在request級別使用信息共享,使用重定向必然出錯5■還有一個大的區別就是,重定向可以訪問自己web應用以外的資源一、調用方式我們知道,在servlet中調用轉發、重定向的語句如下:request.getrequestdispatcher(new.jsp).forward(request,response);//轉發到new.jspresponse.sendredirect(new.jsp〃重定向到new.jsp在jsp頁面中你也會看到通過下面的方式實現轉發:jsp:forwardpage=apage.jsp/當然也可以在jsp頁面中實現重定向:%response.sendredirect(new.jsp//重定向到new.jsp%二、本質區別解釋一一句話,轉發是服務器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個動作的工作流程:轉發過程:客戶瀏覽器發送http請求 》web服務器接受此請求--》調用內部的一個方法在容器內部完成請求處理和轉發動作 》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。重定向過程:客戶瀏覽器發送http請求-》web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址■一》服務器根據此請求
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高智商男孩測試題及答案
- 焦點醫學基本知識考試試題及答案2024年
- 藥物安全與有效性考題研究試題及答案
- 系統架構設計師應掌握的工具試題及答案
- 項目成本控制的實際應用與挑戰試題及答案
- 計算機二級考試對學習環境的適應性考察試題及答案
- 計算機二級考試復習試題及答案指南
- 舞鋼中考英語試題及答案
- 高考數學培優微專題《函數的周期性》解析版
- 高考數學90個考點90個專題專題《以斜率和為約束或目標的幾種必會套路》解析版
- 圖書館建筑設計規范講解課件
- 考研考博-英語-北京建筑大學考試押題卷含答案詳解3
- 湘教版七年級上冊等高線地形圖
- 車間改造合同范文
- 愛蓮說-王崧舟
- 光伏支架安裝施工協議
- 保定市縣級地圖PPT可編輯矢量行政區劃(河北省)
- 第四章通道內非耦合層流的
- 供水管網施工組織設計
- 異面直線所成的角與求法
- 信息安全風險評估培訓(課堂PPT)
評論
0/150
提交評論