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. Spring Boot Mail通过QQ邮箱发送邮件

    本文将介绍如何在Spring Boot工程完成QQ邮箱配置,实现邮件发送功能. 一.在pom文件中添加依赖 <dependency> <groupId>org.springfr ...

  2. SpringMVC中文乱码踩坑

    问题 使用SpringMVC在返回一个字符串时发生了中文乱码问题.produces属性无效 @RequestMapping(value = "/nihao", produces = ...

  3. 通过jstack日志分析和问题排查

    简介 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁.死循环 ...

  4. [解决方案]docker: Error response from daemon: OCI runtime create failed

    错误原因 在新服务器上安装好docker后,发现无法运行,经常一顿搜索后,发现是docker安装的版本过高,最新版本docker-18.06 的核心好像没有经过充分的测试就发布了. 导致一运行,就提示 ...

  5. UI_UE在线就业班(2)(Adobe Illustrator软件学习)

    Adobe Illustrator软件的使用     认识AIUI_UE在线就业班(2) .   ▼ AI是Adobe Illustrator的英文缩写,是Adobe公司旗下推出的一款基于矢量图形制作 ...

  6. Github连接远程仓库详细操作

    首先 咱们需要配置ssh密钥   如何生成密钥呢    我们先来看下命令 在桌面新建一个文件夹,命名规范尽量不要使用中文,然后在文件夹内  新建测试文本: 如图   在文件夹内空白处右击进入GIt b ...

  7. 电脑常用快捷键及常用的DOS命令

    电脑常用快捷键 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+A:全选 Ctrl+X:剪切 Ctrl+Z:撤销 Ctrl+S:保存 Alt+F4:关闭窗口 Shift+delete:永久删除 Wi ...

  8. 第2篇-JVM虚拟机这样来调用Java主类的main()方法

    在前一篇 第1篇-关于JVM运行时,开篇说的简单些 中介绍了call_static().call_virtual()等函数的作用,这些函数会调用JavaCalls::call()函数.我们看Java类 ...

  9. 第6篇-Java方法新栈帧的创建

    在 第2篇-JVM虚拟机这样来调用Java主类的main()方法 介绍JavaCalls::call_helper()函数的实现时提到过如下一句代码: address entry_point = me ...

  10. Install and Update autojump and oh-my-zsh Behind a Firewall

    Brief installation steps: Install git and zsh via yum; 'git clone' autojump and oh-my-zsh from an in ...