sendRedirect()和forward()方法的区别
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()方法的区别的更多相关文章
- java 中sendredirect()和forward()方法的区别
一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重 ...
- (转发)RequestDispatcher的include()方法和forward()方法的区别
forward(): 该方法用于将请求从一个Servlet传递给服务器上的另外的Servlet.JSP页面或者是HTML文件. 在Servlet中,可以对请求做一个初步的处理,然后调用这个方法,将请求 ...
- 【javaWeb】sendRedirect和forward原理及区别总结
一.原理. 1. Forward 该图的交互过程如下: ① 浏览器访问Servlet1. ② Servlet1想让Servlet2对客户端的请求进行响应,于是调用forward()方法 ...
- sendRedirect()和forward()方法有什么区别?
forward是服务器内部的跳转,浏览器的地址栏不会发生变化,同时可以把request和response传递给后一个请求.sendRedirect()是浏览器方面的跳转,要发送两次请求,地址栏也会发生 ...
- HttpServlet RequestDispatcher sendredirect和forward
Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口 ...
- RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别
RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别 先贴一段代码 public void logon(Http ...
- esponse.sendRedirect方式的转向与RequestDispatcher的forward方法的比较
esponse.sendRedirect方式的转向与RequestDispatcher的forward方法的比较 JavaWeb开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户 ...
- sendRedirect和forward区别
参考来源:http://www.educity.cn/develop/158970.html 12.6.4 sendRedirect()和forward()方法的区别 HttpServletResp ...
- sendredirect()和forward()的区别 (转)
sendRedirect() 和forward()的区别 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应UR ...
随机推荐
- Java实现 蓝桥杯VIP 算法提高 递归倒置字符数组
算法提高 递归倒置字符数组 时间限制:1.0s 内存限制:512.0MB 问题描述 完成一个递归程序,倒置字符数组.并打印实现过程 递归逻辑为: 当字符长度等于1时,直接返回 否则,调换首尾两个字符, ...
- java实现日程表
[编程题] 某保密单位机要人员 A,B,C,D,E 每周需要工作5天,休息两天. 上级要求每个人每周的工作日和休息日必须是固定的,不能在周间变更. 此外,由于工作需要,还有如下要求: 1. 所有人的连 ...
- java实现第六届蓝桥杯分机号
分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, 766,918,201 就不符合要求. ...
- 运维、python、docker视频教程
https://space.bilibili.com/97139894/?spm_id_from=333.788.b_7265636f5f6c697374.13 https://www.bilibil ...
- tensorflow2.0学习笔记第一章第二节
1.2常用函数 本节目标:掌握在建立和操作神经网络过程中常用的函数 # 常用函数 import tensorflow as tf import numpy as np # 强制Tensor的数据类型转 ...
- 容器技术之Docker私有镜像仓库harbor
前文我们聊到了docker的私有镜像仓库docker-distribution的搭建和简单的使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13058338 ...
- 2020/06/06 JavaScript高级程序设计 面向对象的程序设计
ECMAScript虽然是一种面向对象的语言,但是他没有类的概念.所以他的对象也与其他语言中的对象有所不同. ECMA-262定义对象:一组没有特定顺序的值. 6.1 理解对象 创建对象的方法: 1. ...
- 0.大话Spring Cloud
天天说Spring cloud ,那到底它是什么? 定义 它不是云计算解决方案 它是一种微服务开发框架 它是(快速构建分布式系统的通用模式的)工具集 它基于Spring boot 构建开发 它是云原生 ...
- MySQL的LIKE模糊查询优化
原文链接:https://www.cnblogs.com/whyat/p/10512797.html %xxx%这种方式对于数据量少的时候,我们倒可以随意用,但是数据量大的时候,我们就体验到了查询性能 ...
- JavaSE的基本语法
JavaSE基本语法 一.语法的注意事项 1.严格区分大小写 2.每句命令结尾使用分号 3.符号都是英文状态 4.括号.引号都是成对出现的! 5.注意缩进 Tips: 文件名和类名可以不一致,但pub ...