Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)
ServletContext可以实现请求转发(ServletContext请求转发相关内容见之前博客:http://blog.csdn.net/megustas_jjc/article/details/53191657),request也可以。HttpServletRequest 和 ServletContext 类似都是数据域对象 , 以Map方式保持数据。但是两者也存在着区别:两者的存活时间不同
- ServletContext对象 服务器启动对象创建,服务器停止对象销毁
- ServletRequest对象 当产生一次请求时创建,当响应结束后,对象销毁
Request对象实现请求转发
request对象实现请求转发(转发其实就是传递对象):请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
应用:Servlet进行数据处理 — 生成结果 — 转发结果给JSP显示
通过request转发请求,request保存数据进行Servlet之间传递 ,以下是一个例子,利用request转发请求,sat语法进行数据的传递,我们定义两个Servlet类,分别为AServlet与BServlet:
Servlet路径映射配置
AServlet:
BServlet
1.request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
2.request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。(request拥有这些方法:setAttribute方法 getAttribute方法 removeAttribute方法 getAttributeNames方法)
RequestDispatcher对象
RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中,对于RequestDispatcher对象的常用使用如下:
RequestDispatcher对象从客户端获取请求request,并把它们传递给服务器上的servlet,html或jsp。它有两个方法:
- 用来传递request的,可以一个Servlet接收request请求,另一个Servlet用这个request请求来产生response。request传递的请求,response是客户端返回的信息。forward要在response到达客户端之前调用,也就是 before response body output has been flushed。如果不是的话,它会报出异常。
- 用来记录保留request和response,以后不能再修改response里表示状态的信息。
Response的重定向例子与详细介绍,可以参考之前的一篇关于ServletResponse的博客:http://blog.csdn.net/megustas_jjc/article/details/53286372
其中需要注意的是RequestDispatcher与sendRedirect的区别
- request.getRequestDispatcher()是请求转发,前后页面共享一个request,因为共用一个request 对象,新航道英语forward()方法在服务器端执行,因此可以保证信息的共享。response.sendRedirect()是重新定向,前后页面不是一个request。
- RequestDispatcher.forward()是在服务器端运行; HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成.
所以RequestDispatcher.forward()对于浏览器来说是“透明的”;
而HttpServletResponse.sendRedirect()则不是。 - ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径; 而
ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。因为
ServletRequest具有相对路径的概念;而ServletContext对象无次概念。 - response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参 数,如: url?id=1.
request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求 能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。而 sendRedirect()会新建request对象,所以上一个request中的数据会丢失。
两者更为具体的原理解释:
redirect 会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器,雅思报名费 然后 服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的. (原理图可以参见之前Response的博客)
forward 发生在服务器内部, 在浏览器完全不知情的情况下发给了浏览器另外一个页面的response. 这时页面收到的request不是从浏览器直接发来了,可能己经用request.setAttribute在request里放了数据.在转到的页面可直接用request.getAttribute获得数据。
运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何 URL。
请求重定向地址栏会发生变化.请求转发地址栏不发生变化.
请求重定向两次请求两次响应.请求转发一次请求一次响应.
小结:
- 转发一次请求、一次响应; 重定向 两次请求 两次响应
- 转发只能跳转站内程序,重定向定向任何站点
- 转发 URL地址不变 ,重定向URL地址改变
- 转发 对客户端不可见,重定向对客户端可见
- 转发共享同一个Request中数据,重定向两次请求,不同Request对象,不能共享Request数据
- 重定向 302 + Location —- 简写 sendRedirect
- RequestDispatcher 的 include 方法 用来做页面布局 —— <%@include%>
将页面公共部分抽取出来,通过include 引用到页面中 —- 更加方便维护
转载于:https://www.cnblogs.com/zhangyanran/p/10082158.html
Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)相关推荐
- 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆
三天自动登陆项目源码:GitHub地址-LoginSystem JDBC 手写SORM框架 手写Servlet 开发环境:Eclipse 一.请求乱码问题解决 // 设置请求.响应编码格式req.se ...
- Request和Response-学习笔记02【请求转发和request共享数据、Request_获取ServletContext、request登录案例】
Java后端 学习路线 笔记汇总表[黑马程序员] Request和Response-学习笔记01[Request_原理和继承体系.Request_获取请求数据][day01] Request和Resp ...
- MySQL高级学习笔记(四)
文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...
- Servlet学习笔记 Servlet原理
Servlet学习笔记 Servlet原理 一.Servlet基础 1.Servlet执行过程 用户请求一个Servlet,Servlet容器自动构建请求和响应对象,然后执行Servlet的servi ...
- 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等
文章目录 一.Servlet 概述 二.Servlet HelloWorld 三.Servlet 继承关系 四.Servlet 生命周期 五.ServletConfig 和 ServletContex ...
- JavaScript学习笔记(四)(DOM)
JavaScript学习笔记(四) DOM 一.DOM概述 二.元素对象 2.1 获取方式 (1).通过ID获取一个元素对象,如果没有返回null (2).通过`标签名`获取一组元素对象,,如果没有返 ...
- 【http学习笔记四】安全篇
[http学习笔记四]安全篇 文章目录 [http学习笔记四]安全篇 一.HTTPS 与 SSL/TLS ① 什么是安全? 机密性 完整性 身份认证 不可否认 ② 什么是HTTPS? ③ SSL/TL ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...
最新文章
- Cache Aside Pattern(缓存模式)
- 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)
- hibernate -- 分页模糊查询中setParameter 和setParameterList
- 如果你也想做实时数仓…
- ElasticSearch 实践过程中遇到的几个小问题
- PHP实现类似百度搜索自动完成(代码简单)
- 特斯拉中国月销破5万台创纪录:每46秒就能卖出一辆车
- Minecraft InputFix
- AD放置过孔按TAB键使过孔大小为设置值0.6/0.3
- 关于移动端设备适配的问题
- 让你提前认识软件开发(3):学校C语言教材的缺陷
- 犀牛脚本插件-python-vb-编辑使用方式-rhino脚本插件
- 英语作文 计算机新技术对生活的影响,科技的影响高中英语作文3篇
- NSIS添加everyone权限
- 智能仓储系统作业流程及价值
- 推荐:三少的新书 - 阴阳冕
- Vue中的keep-alive组件
- nmp i报错git --no-replace-objects ls-remote
- 斐讯(Phicomm)空气检测仪(悟空 M1)通过 EasyLink
- linux清除僵尸进程,如何清理和避免linux系统僵尸进程
热门文章
- 面试了上百位性能测试后,我发现了一个令人不安的事实
- 统计订单:复选+全选+计算 的列表
- 使用git在本地电脑与远程GitHub/gitlub库中clone别人的github上的远程仓库代码,找资源
- 1.请求安全-- MD5的必要性以及实际应用场景
- 虚拟机如何设置ftp服务器,虚拟机设置ftp服务器配置
- google protobuf 实体类和java对象互转_ProtoBuf为什么被吹出天际
- 【MyBatis】MyBatis Order By 字段动态动态排序
- 【算法】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 【kafka】kafka Group coordinator lookup for group
- 【Zookeeper】zookeeper客户端KeeperErrorCode = ConnectionLoss