forward与sendRedirect

     原本觉着网上大神博客那么多,应该不须要本身这个菜鸟写什么了,可是近来发现网上大神可能是不错,可是坑也是跟着几何倍数的上涨,就拿forward和sendRed的区别来说,网上一搜一大堆,可是彻底没有彻底没有错误的讲解,在被架构师把exception扔到我面前指着个人鼻子喷了两回口水后,方知此事仍是要躬行,实践事后把本身的所得记到这里,一是本身备忘,二来也但愿本身能给广大猴子们一个正确的参考。java

      基本原理:web

      forward发生在服务端,对客户端是彻底“透明”的,从一个servlet直接去请求另一个servlet,客户端神马都不知道,浏览器地址栏天然不会发生变化,仍是第一个请求的url地址;浏览器

      sendRedirect要通过客户端的配合,客户端发送request1到达服务端,服务端接收request1并生成response1,sendRedirect时服务端会向reponse1头部写入须要从新请求的url,客户端收到reponse1时发现本身被耍了,还得再请求一次,无奈又发了个request2到url,url指定的servlet返回response2到客户端,客户端才算完事,浏览器地址栏显然也会发生改变。服务器

      因而可知,通常状况下forward是比sendRedirect要快的,为啥?你当我啥都没说。。。
架构

      下面说说本次主要验证的几点:
url

      1.无论是forward仍是sendRedirect语句执行完后,后面的代码都会照常执行!之因此不按后面的代码跑的结果来显示,本人实验后发现是由于转发把后面代码的执行结果给覆盖了,这里有个疑问,为何不少书籍和资料上都讲forward执行后,后面的代码就不会执行了呢?是由于期间sun对forward进行了改动而这些资料没有及时更新?
开发

      2.转发的时候传值的问题:get

         因为forward从始至终只有一个request在跑,因此request.getParameter方法能够获取客户端发送请求的时候附带的数据和forward的url本身在url地址后追加的数据,也能够在java中使用setAttribute方法写入数据而后用getAttribute方法把数据读出来,总之,因为只有一个request,原先的数据不会丢失,还能够新添加数据进去;博客

        基于forward的特性,sendRedict就很好理解了,sendRedict的过程当中生了俩request,第二个request到达servlet的时候显然没法访问第一个request中的数据了,这俩就不是一我的儿好吗?除非你本身处理把第一我的带的东西复制一份给第二我的带着,你能够在sendRedict的url后面直接加上请求的数据,这至关于指定了第二个request的url,servlet天然是能够获取到的。
servlet

      3.forward和sendRedict均可以使用相对路径或绝对路径进行跳转!区别在于forward只能跳转到同一web项目内,而sendRedict能够随意跳,另外,跳转路径以"/"开头时,forward表示相对于访问web项目的根路径,而sendRedict表示相对于访问应用服务器的根路径,我的猜想正是由于forward只能访问同一web项目,因此java开发者默认"/"为项目的访问路径了;


     因为代码比较简单,就不往上贴了,以上都是笔者我的的一点经验,欢迎你们回帖讨论,同时有错误之处欢迎你们批(来)评(打)指(我)正(呀)!

相关文章
相关标签/搜索