博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
forward与sendRedirect
阅读量:6834 次
发布时间:2019-06-26

本文共 1465 字,大约阅读时间需要 4 分钟。

hot3.png

     本来觉着网上大神博客那么多,应该不需要自己这个菜鸟写什么了,但是近来发现网上大神多是不错,但是坑也是跟着几何倍数的上涨,就拿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

你可能感兴趣的文章
计算机的鼻祖---差分机的由来
查看>>
责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
查看>>
Maven聚合项目在eclipse中显示没有层次
查看>>
牛人博客
查看>>
PowerShell文件系统(一)前言
查看>>
【Nodejs】理想论坛帖子爬虫1.02
查看>>
about reviewboard stack information
查看>>
第20章 数据库操作----JDBC概述
查看>>
js 取父级 页面上的元素
查看>>
XQuery的sql:variable() 函数
查看>>
阿里、有道科大讯飞齐为荣耀Magic2打call,透露YOYO想不到的技能
查看>>
微服务在微信的架构实践
查看>>
HTTP Header简介
查看>>
Java并发编程----阻塞队列
查看>>
极简教程: 使用 matplotlib 绘制 GIF 动图
查看>>
数据库分片(Database Sharding)详解
查看>>
技术风险防控平台:打造金融交易系统的故障免疫能力
查看>>
怎样把酷狗音乐wav转化成高品质的MP3格式?
查看>>
浅谈算法学习
查看>>
前端知识点——图片
查看>>