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 引用到页面中 —- 更加方便维护
Servlet学习笔记(四)之请求转发与重定向(RequestDispatcher与sendRedirect)的更多相关文章
- servlet学习笔记四
Servlet 主要内容: 1)servlet初始化参数与上下文参数 2)过滤器 3)监听器一.servlet初始化参数与上下文参数 1)servlet初始化参数 把某些变量放在web.xml配置,到 ...
- Servlet(五):请求转发和重定向
请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...
- Servlet学习笔记06——什么是转发,路径,状态管理?
1.include指令 (1)作用: 告诉容器,在将jsp转换成Servlet时,将 某个文件的内容插入到该指令所在的位置. (2)语法: <%@ include file="&quo ...
- nodejs学习笔记<四>处理请求参数
在web开发中处理请求参数是个非常常见的工作:nodejs提供了了querystring用来处理请求参数. querystring常用方法有:parse,stringify. (1)parse: 解析 ...
- Servlet学习笔记(四)
目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...
- Servlet学习笔记(三)
目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...
- Servlet学习笔记(二)
目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...
- servlet学习笔记_4
一.response.1.response.characterEncoding和response.setContentType("text/html;charset=UTF-8") ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
随机推荐
- 接口开发---basic auth接口认证
开发中遇到了basic auth来认证的案例,这里总结一下: Basic Auth简单点说明就是每次请求API时都提供用户的username和password.[base64encode(userna ...
- odoo里的rpc用法
import odoorpcdb_name = 'test-12'user_name = 'admin'password = 'admin'# Prepare the connection to th ...
- string子串匹配(用string自带函数,不涉及char数组转换)
using namespace std; #include <iostream> #include<string> //第1种,用string自带的s.subdtr()截取任意 ...
- memcache(11211)未授权访问
1.安装Memcache服务端 sudo apt-get install memcached 2.启动服务 sudo memcached -d -m 128 -p 11211 -u root 3.ap ...
- C++ //多继承语法 C++中允许一个类继承多个类
1 //多继承语法 C++中允许一个类继承多个类 2 #include <iostream> 3 #include <string> 4 using namespace std ...
- 五、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之MVVM中的EventAggregator
这一篇我们主要再看完示例12.13后,写了个例子,用于再Modules下执行ApplicationCommands,使用IActiveAware执行当前View的Commands,或者Applicat ...
- openstack June all-in-one 安装手册
by lt,hyc 1.安全规范 表1:openstack用户和密码值设置 用户名 含义 本文的设置值 Admin openstack管理员用户 ADMIN_PASS Keystone openst ...
- PaddlePaddle之猫狗大战(本地数据集)
新手入门PaddlePaddle的一个简单Demo--猫狗大战 主要目的在于整体了解PP用卷积做图像分类的流程,以及最最重要的掌握自定义数据集的读取方式 猫狗数据集是从网络上下载到工作目录的. 本项目 ...
- Cookie和Session得使用理解
Cookie 饼干 什么是Cokkie? 1.Cookie 翻译过来是饼干的意思. 2.Cookie 是服务器通知客户端保存键值对的一种技术. 3.客户端有了 Cookie 后,每次请求都发送给服务器 ...
- HTML5(十一)——WebSocket 基础教程
一.为什么要学 WebSocket? websocket 是 HTML5 提供的一种长链接双向通讯协议,使得客户端和服务器之间的数据交换更简单,允许服务端主动向客户端推送数据,并且客户端与服务端只需连 ...