forward与sendRedirect

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

      基本原理:

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

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

      由此可见,一般情况下forward是比sendRedirect要快的,为啥?你当我啥都没说。。。

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

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

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

         由于forward从始至终只有一个request在跑,所以request.getParameter方法可以获取客户端发送请求的时候附带的数据和forward的url自己在url地址后追加的数据,也可以在java中使用setAttribute方法写入数据然后用getAttribute方法把数据读出来,总之,由于只有一个request,原先的数据不会丢失,还可以新添加数据进去;

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

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


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


转载于:https://my.oschina.net/u/580449/blog/547811

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值