一. RequestDispatche

是一个Web资源的包装器,可以用来把当前的Request传递给该资源,或者把新的资源包括到当前的相应中。详细来说:RequestDispatch对象从客户端获取请求request,并把他们传递到服务器上的servlet、html、jsp。

有两个方法,include()/forward()

1. include()

  • void include(ServletRequest request,ServletResponse response)
  • 用来记录保留request和response,以后不能再修改response里表示状态的信息。

2. forward() 转向

void forward(ServletRequest request,ServletResponse response)

// 1. 跳转到指定的页面“dealWith.jsp”;
String url = "dealWith.jsp"; //2. 获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置
RequestDispatcher requestDispatcher = request.getRequestDispatcher(url); // 3. 执行跳转,将参数request和response传递给这个页面
requestDispatcher.forward(request, response);

二.重定向的两种方法比较:forward & sendRedirect

1. HttpServletResponse.sendRedirect(location)

1)作用:该方法将相应定向到参数location指定的新的URL。

2)location:可以是绝对地址,也可以是相对URL。

注意:Redirect能够防止某些情况下客户端Refresh造成的一些未知后果(例如连续删除)

2. forward & sendRedirect 比较

  本质  地址栏显示 数据共享 运用地方 效率 工作流程
forward 服务器请求资源,服务器直接访问目标地址的URL,读取该URL的相应内容,然后把这些内容再发给服务器 不变(转发路径必须是同一个web容器下的URL) 转发页面和转发到的页面可以共享request里面的数据. 一般用于用户登陆的时候,根据角色转发到相应的模块.

一次请求

sendRedirect 客户端行为,服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址 新的URL(Location可以是任意地址) 不能共享 一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 至少两次请求

其中两个动作的工作流程:

1. 转发过程(forward)

客户浏览器发送Http请求——>web服务器接受该请求——>调用内部的一个方法在容器内完成请求处理和转发动作——>将目标资源发送给客户

上面直接转发请求的过程:

1)浏览器向Servlet1发出请求

2)Servlet1调用forward()方法,在服务器端将请求转发给Servlet2

3)最终由Servlet2做出相应

举例:A向B借钱,B没有钱,向C借钱,借没有借到钱都会将消息回复给A

  • 在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,
  • 中间传递的是自己的容器内的request。
  • 在客 户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

2. 重定向过程(sendRedirect)

客户浏览器发送Http请求——>web服务器接受此请求后,发送302响应码以及新的location给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的Http请求,请求url是新的location地址——>服务器根据此请求寻找资源发送给客户。

具体而言:

1)浏览器向Servlet1发出访问请求

2)Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2

3)浏览器向Servlet2发出请求

4)最终由Servlet2做出相应

举例:它一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。

A向B借钱,B没有钱让A向C借钱。

  • 在这里 location可以重定向到任意URL
  • 既然是浏览器重新发出了请求,则就没有什么request传递的概念了。
  • 在客户浏览器路径栏显示的是其重定向的 路径,客户可以观察到地址的变化的。
  • 重定向行为是浏览器做了至少两次的访问请求的。

转发(forward)和重定向(sendRedirect)的更多相关文章

  1. 转发forward和重定向redirect的区别

    本质区别:转发只发送一次请求,重定向发送两次请求. 转发: request.getRequestDispatcher("/HiServlet").forward(request,r ...

  2. 转发(Forward)和重定向(Redirect)的区别

    转发是服务器行为,重定向是客户端行为. 转发(Forword) :通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServle ...

  3. 请求转发(forward)和重定向(redirect)的区别

    转发不会改变地址栏,重定向会. 转发是请求一次,重定向请求两次. 转发过程中只有一个request对象产生,重定向是两个. 转发不能转发到站外,重定向可以发送到站外. 重定向的第2个请求的请求方式是什 ...

  4. 请求转发(forward)和请求重定向(redirect)的区别(转)

    作者:@haimishasha本文为作者原创,转载请注明出处:https://www.cnblogs.com/haimishasha/p/5952129.html 用户向服务器发送了一次HTTP请求, ...

  5. 直接请求转发(Forward)和间接请求转发(Redirect)两种区别?

    用户向服务器发送了一次HTTP请求,该请求肯能会经过多个信息资源处理以后才返回给用户,各个信息资源使用请求转发机制相互转发请求,但是用户是感觉不到请求转发的.根据转发方式的不同,可以区分为直接请求转发 ...

  6. javaWeb中request请求转发和response重定向

    1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL.  2.request.get Forward代码中的&q ...

  7. 请求转发 和 URL 重定向

    五 请求转发 和 URL 重定向 1 请求转发和重定向 干什么用? 是我们在java后台servlet中 由一个servlet跳转到 另一个 servlet/jsp 要使用的技术 前端发送请求到后台 ...

  8. Servlet(10)—请求转发和请求重定向

    请求转发与请求重定向 ①区别: 本质区别:请求转发只发出一次请求,请求重定向则发出两次请求. 请求转发:地址栏是初次发出请求的地址在最终的Servlet中,request对象和中转的那个request ...

  9. 请求转发(forward)和请求包含(include)的区别?

    请求包含的例子 第一个Servlet (DispatcherServlet) @Override protected void doGet(HttpServletRequest req, HttpSe ...

  10. JSTL、请求转发和URL重定向

    JSTL 为什么要使用JSTL? 因为在JSP中写JAVA代码很麻烦,而JSTL可以简化在JSp中写JAva代码的流程 如何使用JSTL? 准备工作: ①将JSTL依赖的jar包导入工程的WEB-IN ...

随机推荐

  1. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  2. 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)

    PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...

  3. SQL Server 2008通过LinkServer连接MySQL

    链接过程就不过多描述了,搜索下都有一大堆的内容. 链接成功以后,如何调用的问题,通过“编写select脚本”的方式生成的脚本如下: [备注:asset_manager是数据库名,admin是表名] - ...

  4. C++11引用临时变量的终极解析

    工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正.   **** ...

  5. C#小程序呢飞行棋设计分析

    C#小程序飞行棋,程序效果图 1.设计分析 这个程序界面大致分为四部分: ① 最上面游戏名字界面 ②信息提示区 ③游戏界面区 ④游戏操作提示区 2.分区设计实现 一.游戏界面显示区,由于只需要显示出图 ...

  6. SVN服务器的搭建和使用

    VisualSVN Server和TortoiseSVN的下载,安装,汉化:SVN服务器搭建和使用(一) 如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用:SVN服 ...

  7. LR12.53—第6课:运行负载测试

    第6课:运行负载测试 当你运行一个负载测试,LoadRunner将生成系统上的负载.然后,您可以使用LoadRunner的监控器和图形负载下,观察系统的性能. 在这一课中,你将涵盖以下主题: 一目了然 ...

  8. 转:ServletContext,ActionContext,ServletActionContext

    ServletContext ServletContext从他的package信息可以看出,它是标准的JavaEE WebApplication类库 javax.servlet.ServletCont ...

  9. Dev ChartControl鼠标移动显示坐标点

    his.chartIRC_RATES.MouseMove += new MouseEventHandler(chartIRC_RATES_MouseMove); ToolTipController t ...

  10. python中的浅拷贝和深拷贝

    1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...