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。它有两个方法:

  1. 用来传递request的,可以一个Servlet接收request请求,另一个Servlet用这个request请求来产生response。request传递的请求,response是客户端返回的信息。forward要在response到达客户端之前调用,也就是 before response body output has been flushed。如果不是的话,它会报出异常。
  2. 用来记录保留request和response,以后不能再修改response里表示状态的信息。

Response的重定向例子与详细介绍,可以参考之前的一篇关于ServletResponse的博客:http://blog.csdn.net/megustas_jjc/article/details/53286372

其中需要注意的是RequestDispatchersendRedirect的区别

  • 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。

请求重定向地址栏会发生变化.请求转发地址栏不发生变化.
请求重定向两次请求两次响应.请求转发一次请求一次响应.

小结:

  1. 转发一次请求、一次响应; 重定向 两次请求 两次响应
  2. 转发只能跳转站内程序,重定向定向任何站点
  3. 转发 URL地址不变 ,重定向URL地址改变
  4. 转发 对客户端不可见,重定向对客户端可见
  5. 转发共享同一个Request中数据,重定向两次请求,不同Request对象,不能共享Request数据
  6. 重定向 302 + Location —- 简写 sendRedirect
  7. RequestDispatcher 的 include 方法 用来做页面布局 —— <%@include%>
    将页面公共部分抽取出来,通过include 引用到页面中 —- 更加方便维护

转载于:https://www.cnblogs.com/zhangyanran/p/10082158.html

Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)相关推荐

  1. 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆

    三天自动登陆项目源码:GitHub地址-LoginSystem JDBC 手写SORM框架 手写Servlet 开发环境:Eclipse 一.请求乱码问题解决 // 设置请求.响应编码格式req.se ...

  2. Request和Response-学习笔记02【请求转发和request共享数据、Request_获取ServletContext、request登录案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] Request和Response-学习笔记01[Request_原理和继承体系.Request_获取请求数据][day01] Request和Resp ...

  3. MySQL高级学习笔记(四)

    文章目录 MySQL高级学习笔记(四) 1. MySql中常用工具 1.1 mysql 1.1.1 连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 ...

  4. Servlet学习笔记 Servlet原理

    Servlet学习笔记 Servlet原理 一.Servlet基础 1.Servlet执行过程 用户请求一个Servlet,Servlet容器自动构建请求和响应对象,然后执行Servlet的servi ...

  5. 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等

    文章目录 一.Servlet 概述 二.Servlet HelloWorld 三.Servlet 继承关系 四.Servlet 生命周期 五.ServletConfig 和 ServletContex ...

  6. JavaScript学习笔记(四)(DOM)

    JavaScript学习笔记(四) DOM 一.DOM概述 二.元素对象 2.1 获取方式 (1).通过ID获取一个元素对象,如果没有返回null (2).通过`标签名`获取一组元素对象,,如果没有返 ...

  7. 【http学习笔记四】安全篇

    [http学习笔记四]安全篇 文章目录 [http学习笔记四]安全篇 一.HTTPS 与 SSL/TLS ① 什么是安全? 机密性 完整性 身份认证 不可否认 ② 什么是HTTPS? ③ SSL/TL ...

  8. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  9. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  10. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

最新文章

  1. Cache Aside Pattern(缓存模式)
  2. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)
  3. hibernate -- 分页模糊查询中setParameter 和setParameterList
  4. 如果你也想做实时数仓…
  5. ElasticSearch 实践过程中遇到的几个小问题
  6. PHP实现类似百度搜索自动完成(代码简单)
  7. 特斯拉中国月销破5万台创纪录:每46秒就能卖出一辆车
  8. Minecraft InputFix
  9. AD放置过孔按TAB键使过孔大小为设置值0.6/0.3
  10. 关于移动端设备适配的问题
  11. 让你提前认识软件开发(3):学校C语言教材的缺陷
  12. 犀牛脚本插件-python-vb-编辑使用方式-rhino脚本插件
  13. 英语作文 计算机新技术对生活的影响,科技的影响高中英语作文3篇
  14. NSIS添加everyone权限
  15. 智能仓储系统作业流程及价值
  16. 推荐:三少的新书 - 阴阳冕
  17. Vue中的keep-alive组件
  18. nmp i报错git --no-replace-objects ls-remote
  19. 斐讯(Phicomm)空气检测仪(悟空 M1)通过 EasyLink
  20. linux清除僵尸进程,如何清理和避免linux系统僵尸进程

热门文章

  1. 面试了上百位性能测试后,我发现了一个令人不安的事实
  2. 统计订单:复选+全选+计算 的列表
  3. 使用git在本地电脑与远程GitHub/gitlub库中clone别人的github上的远程仓库代码,找资源
  4. 1.请求安全-- MD5的必要性以及实际应用场景
  5. 虚拟机如何设置ftp服务器,虚拟机设置ftp服务器配置
  6. google protobuf 实体类和java对象互转_ProtoBuf为什么被吹出天际
  7. 【MyBatis】MyBatis Order By 字段动态动态排序
  8. 【算法】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
  9. 【kafka】kafka Group coordinator lookup for group
  10. 【Zookeeper】zookeeper客户端KeeperErrorCode = ConnectionLoss