sendRedirect()和forward()方法的区别

之前好像曾经整理过,但忘了放在哪里了,好像压根就没整理过,博客里也没有,故今天重新整理一下。

我们知道页面之间的跳转有两种方式:重定向与转发

跳转:顾名思义,就是页面跳转。

虽然二者都可以实现获取相应的url资源,但首先要注意的是,重定向由sendRedirect来实现,请求转发由forward来实现。

在跳转范围上forward方法只能重定向到同一个web应用程序中的一个资源,仅仅局限在同一个服务器内;而sendRedirect方法不仅可以在位于同一主机上的不同web应用程序之间进行重定向,而且可以将客户端重定向到其它服务器上的web应用程序资源。

先给出sendRedirect方法的工作原理图:

描述一下上图的过程:浏览器先向servlet1发送一次request请求,servlet1让servlet2为客户端服务,servlet1调用sendRedirect方法,将客户端的request请求重定向到servlet2(告诉浏览器servlet2的位置,让浏览器重新访问servlet2,这样就会发现地址栏会发生相应变化,这也是和forward的一个重要区别)。最后servlet2对请求做出响应。上图中产生了两次请求。

下面再给出forward方法的工作原理图:

描述一下上图的过程:浏览器先向servlet1发送请求,servlet1让servlet2为客户端服务,servlet1调用forward方法,将客户端的请求转发给servlet2处理(这里浏览器地址栏是不会变化的,因为没告诉浏览器),servlet2对请求做出响应。

对重定向和请求转发的使用分别举个实例,如下:

//重定向到index.jsp页面
response.sendRedirect("/ServletStudy/index.jsp");
//如果你不想写前面的项目名,可以写成下面这样
response.sendRedirect(request.getContextPath() + "/index.jsp");
//获取到requestDispatcher对象,跳转到index.jsp
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.jsp");
//调用requestDispatcher对象的forward实现转发,传入request和response方法
requestDispatcher.forward(request,response);

把上面这些话用一个表格表示,如下:

区别 forward sendRedirect
是否可转向本web应用之外的页面或网站
实际发生位置 服务端 客户端
用法 request.getRequestDispatcher("/资源名").forward(request,response)(注意:转发时"/"代表的是本应用程序的根目录,比如"/web应用名") response.sendRedirect("/web应用/资源名") (重定向时"/"代表的是webapps目录,这个目录在tomcat那个目录下)
传送数据的类型 转发的request对象可以传递各种类型的数据,包括对象 重定向只能传递字符串,就是在路径后面加
跳转时间 转发时:执行到跳转语句后就会立即跳转 重定向:整个页面执行完成后才执行跳转,也就是说其后的代码有执行机会
在跳转前request对象setAttribute();的值是否会丢失 不会
转向速度
地址栏 不变
应用场景 访问Servlet处理业务逻辑,然后forward到jsp显示处理结果 提交表单,处理成功后redirect到另一个jsp,防止表单重复提交

sendRedirect()和forward()方法的区别的更多相关文章

  1. java 中sendredirect()和forward()方法的区别

     一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重 ...

  2. (转发)RequestDispatcher的include()方法和forward()方法的区别

    forward(): 该方法用于将请求从一个Servlet传递给服务器上的另外的Servlet.JSP页面或者是HTML文件. 在Servlet中,可以对请求做一个初步的处理,然后调用这个方法,将请求 ...

  3. 【javaWeb】sendRedirect和forward原理及区别总结

    一.原理.  1. Forward        该图的交互过程如下: ① 浏览器访问Servlet1. ② Servlet1想让Servlet2对客户端的请求进行响应,于是调用forward()方法 ...

  4. sendRedirect()和forward()方法有什么区别?

    forward是服务器内部的跳转,浏览器的地址栏不会发生变化,同时可以把request和response传递给后一个请求.sendRedirect()是浏览器方面的跳转,要发送两次请求,地址栏也会发生 ...

  5. HttpServlet RequestDispatcher sendredirect和forward

    Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口 ...

  6. RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别

    RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别 先贴一段代码 public void logon(Http ...

  7. esponse.sendRedirect方式的转向与RequestDispatcher的forward方法的比较

    esponse.sendRedirect方式的转向与RequestDispatcher的forward方法的比较 JavaWeb开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户 ...

  8. sendRedirect和forward区别

    参考来源:http://www.educity.cn/develop/158970.html 12.6.4  sendRedirect()和forward()方法的区别 HttpServletResp ...

  9. sendredirect()和forward()的区别 (转)

    sendRedirect() 和forward()的区别 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应UR ...

随机推荐

  1. java类加载器是什么?

    类加载器是有了解吗? 解析:底层原理的考察,其中涉及到类加载器的概念,功能以及一些底层的实现. 答:顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说 ...

  2. java实现汉诺塔计数

    ** 汉诺塔计数** 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下 ...

  3. java实现第八届蓝桥杯平方十位数

    平方十位数 题目描述 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最小的一个平方数. 请你找出其中 ...

  4. 教科书级讲解,秒懂最详细Java的注解

    所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...

  5. Python内置Turtle绘图库方法简介+多案例

    urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的 ...

  6. Spring之多数据源切换的应用

    这不是一个新的知识点扩展,顶多算是,Spring的AOP特性的一个应用.那么下面开始今天的学习之旅! 场景 数据库读写分离,或者分库,总之多数据源的场景,怎么样实现自动切换(PS:不考虑各种分库分表的 ...

  7. 织梦cms 内容模型 option下拉框 value 分离

    需要修改的文件在根目录include/customfields.func.php文件 foreach($items as $v) { $v = trim($v); if($v!='') { $myfo ...

  8. [转] 使用diskpart命令修复U盘分区

    点击阅读原文 前段时间在论坛上讨论封装PE到u盘里热闹的,就想自己也封装一个,随便下载了一个WIN7的PE封装后发现还不错,本来就是做测试用的,测试完了就想把u盘在恢复成以前的样子,可是发现恢复并不是 ...

  9. [原创][开源] SunnyUI.Net 开发日志:UIBarChart 坐标轴刻度取值算法

    _ 在开发UIBarChart的过程中,需要绘制Y轴的刻度,数据作图时,纵横坐标轴刻度范围及刻度值的取法,很大程度上取决于数据的分布.对某一组数据,我们很容易就能知道如何选取这些值才能使图画得漂亮.但 ...

  10. Ubuntu18.04 安装QQ、Tim、微信与win无差异

    一.安装deepin-wine环境: 桌面下打开终端,依次输入以下命令 git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.git ...