我们知道,在servlet中调用转发、重定向的语句如下:

<span style="font-size:18px;">request.getRequestDispatcher("test.jsp").forward(request,response);   //转发到test.jsp
response.sendRedirect("test.jsp");   //重定向到test.jsp</span>

在jsp页面中你也会看到通过下面的方式实现转发:

<jsp:forward page=" test.jsp" />

当然也可以在jsp页面中实现重定向:

<%response.sendRedirect("test.jsp");%> //重定向到test.jsp

解释一:从工作原理上分析

一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

请求转发(RequestDispatcher)的过程

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。

重定向(sendRedirect)的工作原理:

客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。

解释二:从表面理解

1、重定向,其实是两次request第一次,客户端request   A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失.例子:

    response.sendRedirect("loginsuccess.jsp");

2、请求转发是服务器内部把对一个request/response的处理权,移交给另外一个对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。

例子:

      RequestDispatcherdis=request.getRequestDispatcher(“loginsuccess.jsp”);Dis.forward(request,response);

转发:

1.转发不会改变浏览器的地址栏

2.转发共享同一个request

3.转发只能在同一个web应用中使用

重定向:

1.重定向会改变浏览器的地址栏

2.重定向不共享request

3.可以重定向到任意URL

解释三:从生活方面理解

重定向过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器 ”。

于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复,“ 浏览器”也知道他借到的钱出自李四之手。 RequestDispatcher.forward 方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

这个过程好比绰号叫“ 浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。

可见,“浏览器”只发出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。

转发与重定向的区别详解相关推荐

  1. 转发与重定向的使用详解

    原文地址:http://www.2cto.com/kf/201107/97118.html 区别一: 重定向时浏览器上的网址改变 转发是浏览器上的网址不变 区别二: 重定向实际上产生了两次请求 转发只 ...

  2. HashTable和HashMap的区别详解

    HashTable和HashMap的区别详解 一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同 ...

  3. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  4. 转发和重定向的区别?

    实际发生位置不同,地址栏不同 转发是发生在服务器的 转发是由服务器进行跳转的,细心的朋友会发现,在转发的时候,浏览器的地址栏是没有发生变化的,在我访问Servlet111的时候,即使跳转到了Servl ...

  5. 关于numpy中eye和identity的区别详解

    https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...

  6. php为什么需要配置路由器,laravel 配置路由 api和web定义的路由的区别详解

    1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...

  7. python协程详解_对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异 ...

  8. Jar/War/Ear等包的作用与区别详解

    Jar/War/Ear等包的作用与区别详解 以客户角度来看,jar文件就是一种封装格式,用户不需要知道jar包中有多少个.class格式的文件及每个文件中的功能与作用,也可以得到相应的访问的结果.ja ...

  9. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

最新文章

  1. HTML4.0标准语法--表格
  2. 函数式编程语言python-函数式编程
  3. web服务高级使用 Samba共享
  4. Spring IOC (DI-依赖注入)
  5. 每天进步一点点《ML - 线性回归》
  6. python两层装饰器_python装饰器
  7. 【JAVA笔记——道】Hibernate 线程本地化基础篇
  8. 海量数据挖掘MMDS week2: Association Rules关联规则与频繁项集挖掘
  9. Mac升级macOS Big Sur之前如何优化并增加内存空间?
  10. LintCode_13 字符串查找
  11. Mysql的一揽子方案用法
  12. 测绘 绘图 计算机,20 机械测绘与计算机绘图 草图绘制范例 课件:草图绘制范例.pptx...
  13. 实数单竖线,向量双竖线,范数双竖线加下标,矩阵单竖线
  14. 景区电商平台网站建设方案
  15. 仅用1/4数据量还原真人语音100%细节 火山语音上新超自然对话语音合成技术
  16. linux(centos) 保存退出vi编辑
  17. 手机端H5页面边框缺失问题解决
  18. 信创实践之达梦数据库介绍
  19. 研究表明:漂亮的配图会让数据/结果看起更可靠
  20. SAP 凭证跳号分析

热门文章

  1. 无Internet,安全的解决方法
  2. VR技术帮韩国妈妈与去世的女儿再相见,网友:堪比《黑镜》,人能瞬间崩溃...
  3. 如何学习一门编程语言
  4. 要点回顾|2020PGConf.Asia大会精彩落幕,一文带您要点回顾
  5. error LNK1120: 2个无法解析的外部命令:vtkRenderingOpenGL_AutoInit(Construct、Destruct),该函数在......中被引用
  6. 阀门定位器常见的六大故障
  7. K8S中的cordon、uncordon和drain node标签 节点标签
  8. Debian网卡配置
  9. 微服务(二)——注册中心(Eureka、Nacos)
  10. 彻底删除的文件如何恢复?误删数据恢复,四种方法就可以解决