文档章节

forward与sendRedirect

looqy
 looqy
发布于 2015/12/19 13:01
字数 946
阅读 123
收藏 1

     本来觉着网上大神博客那么多,应该不需要自己这个菜鸟写什么了,但是近来发现网上大神多是不错,但是坑也是跟着几何倍数的上涨,就拿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开发者默认"/"为项目的访问路径了;


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


© 著作权归作者所有

looqy
粉丝 10
博文 34
码字总数 13879
作品 0
朝阳
程序员
私信 提问
redirect与forward跳转的区别

Servlet 跳转 redirect与forward跳转的区别 Servlet: 当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面。 一、原理 1) redirect 方式 response.sendRedirect("/a.jsp"); 页面的......

aolin
2016/03/07
45
0
servlet跳转页面的两种方式

sendRedirect和forward 都不会改变session的值和状态; 都可以在URL后面传递参数; request是客户端的对象,response是服务端的对象, response在跳转的时候,必须遵循浏览器地址规范; send...

Ethel_oo
2018/04/23
24
0
请求重定向sendRedirect()方法 和 请求转发forward()方法

一个Web资源受到客户端请求后,通知服务器去调用另外一个Web资源进行处理,称之为请求转发。 一个Web资源受到客户端请求后,通知浏览器去访问另外一个Web资源,称之为请求重定向。 面试题 请...

天蚕宝衣
2016/06/17
270
0
JSP页面跳转的几种方法以及注意点

最近自己在做项目时遇到一个问题,明明加了response.sendRedirect() ,系统也执行了,但是它就是不跳转;最后在网上找到原因如下: 首先我们要知道的是用response.sendRedirect做转向的原理,它其...

大黄有故事
2016/10/14
0
0
java web里面页面跳转的方法总结

在Java Web开发中,经常会用到跳转页面的方法,一般有下面两种方法。 Java代码 Java代码 跳转方式 http://localhost:8080/Test应用 运用forward方法只能重定向到同一个Web应用程序中的一个资...

双月通天
2016/05/20
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

Tensorflow 2.0安装

Tensorflow2.0安装环境: Ubuntu 16.04或更高(64位) Windows 7或者更高(64位,且支持python3) 安装Tensorflow 2.0 GPU版本的需要安装NVIDIA相关软件包: NVIDIA驱动 :版本必须410.x或更...

JosiahMg
26分钟前
4
0
TL138/1808/6748F-EasyEVM开发板硬件、CPU、FLASH、RAM

TL138/1808/6748F-EasyEVM是广州创龙基于SOM-TL138/SOM-TL1808/SOM-TL6748F核心板开发的一款开发板。由于SOM-TL138/SOM-TL1808/SOM-TL6748核心板管脚兼容,所以此三个核心板共用同一个底板。...

Tronlong创龙
34分钟前
4
0
百度嵌入式AI解决方案EdgeBoard之内存驱动设计介绍

1. 背景介绍 由于 FPGA 具备可编程和高性能计算的特点,基于FPGA硬件的AI计算加速,正广泛地应用到计算机视觉处理领域。其中极具代表性的部署方式之一就是使用FPGA和CPU组合构成异构计算系统...

AI君
40分钟前
6
0
开放应用模型(OAM):全球首个云原生应用标准定义与架构模型

Kubernetes 项目作为容器编排领域的事实标准, 成功推动了诸如阿里云 Kubernetes (ACK)等云原生服务的迅速增长。但同时我们也关注到,Kubernetes 的核心 API 资源比如 Service、Deploymen...

Mr_zebra
43分钟前
4
0
《Linux操作系统-Exynos4412》编译和安装Busybox

开发环境:Exynos4412-iTOP-4412开发板 现在 Busybox 的配置已经完成了,接下来开始编译 Busybox,在 Ubuntu 的终端输入 “make”命令开始编译 Busybox,如下图。 下图为编译过程中的截图。 ...

书白
45分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部