转发重定向例子_第1页
转发重定向例子_第2页
转发重定向例子_第3页
转发重定向例子_第4页
转发重定向例子_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

转发重定向例子【篇一:转发重定向例子】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论