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 引用到页面中 —- 更加方便维护

Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)的更多相关文章

  1. servlet学习笔记四

    Servlet 主要内容: 1)servlet初始化参数与上下文参数 2)过滤器 3)监听器一.servlet初始化参数与上下文参数 1)servlet初始化参数 把某些变量放在web.xml配置,到 ...

  2. Servlet(五):请求转发和重定向

    请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...

  3. Servlet学习笔记06——什么是转发,路径,状态管理?

    1.include指令 (1)作用: 告诉容器,在将jsp转换成Servlet时,将 某个文件的内容插入到该指令所在的位置. (2)语法: <%@ include file="&quo ...

  4. nodejs学习笔记<四>处理请求参数

    在web开发中处理请求参数是个非常常见的工作:nodejs提供了了querystring用来处理请求参数. querystring常用方法有:parse,stringify. (1)parse: 解析 ...

  5. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  6. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  7. Servlet学习笔记(二)

    目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...

  8. servlet学习笔记_4

    一.response.1.response.characterEncoding和response.setContentType("text/html;charset=UTF-8") ...

  9. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  10. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

随机推荐

  1. odoo14通过命令行启动以及报错进不去系统问题解决办法

    一.通过CMD命令界面启动odoo:进入odoo-bin目录下:执行 python odoo-bin -c odoo.conf  二.pycharm配置自动安装升级模块:-c E:\odoo14\od ...

  2. 第十五篇 -- QListWidget与QToolButton(界面)

    效果图: 这还只是一个界面,并没有实现相应功能. 先看下这图的构成吧. 工具栏的就是将Action拖上去,这部分前面已经介绍过了,那就看下面这部分的构图. 1.左侧是一个工具箱(ToolBox)组件, ...

  3. 第六篇--MFC美化界面

    1.MFC如何设置背景颜色 首先,为对话框添加WM_CTLCOLOR消息,方法为:右击Dialog窗口 --> Class Wizard --> Messages --> WM_CT ...

  4. python进程间的通讯实现

    1:进程间通讯的方法:apply_async()非阻塞式通讯     apply()阻塞式通讯 2:使用Queue实现对Process创建的进程间通讯, Queue本身是一个消息队列程序,Queue常 ...

  5. 离线安装zadig

    官网:https://koderover.com/ 官方给的离线安装问题有些问题,这里记录下自己离线安装的一些过程. 整体安装思路: 根据官方给出的helm安装方式以及离线安装方式结合而来. 通过官方 ...

  6. 看完就会的Spring Cloud Gateway

    在前面几节,我给大家介绍了当一个系统拆分成微服务后,会产生的问题与解决方案:服务如何发现与管理(Nacos注册中心实战),服务与服务如何通信(Ribbon, Feign实战) 今天我们就来聊一聊另一个 ...

  7. 刷到血赚!字节跳动内部出品:722页Android开发《360°全方面性能调优》学习手册首次外放,附项目实战!

    前言 我们平时在使用软件的过程中是不是遇到过这样的情况:"这个 app 怎么还没下载完!"."太卡了吧!"."图片怎么还没加载出来!".&q ...

  8. OEM 刷新配置方法

    一:设置>添加目标>配置自动搜索 二:主机上的目标>针对所选的主机 三:禁用调度 四:设置>添加目标>自动搜索结果 五:主机上的目标,搜索结果 六:删除 七:选择机器数据 ...

  9. iptables 及容器网络分析

    本文独立博客阅读地址:https://ryan4yin.space/posts/iptables-and-container-networks/ 本文仅针对 ipv4 网络 iptables 提供了包 ...

  10. Special Forms and Syntax Sugars in Clojure

    (...): function literals, p40, 64; '(...): suppress evaluation, p24; _(...): comments, p18; ".. ...