当前位置:首页 > 开发 > 编程语言 > Servlet > 正文

Servlet中请求转发和重定向的原理及区别

发表于: 2015-03-19   作者:JokerLinisty   来源:转载   浏览:
摘要: 1、定义       1)Forward(请求转向):服务器程序内部请求转向,这个特性允许前一个程序用于处理请求,而后一个程序用来返回响应。     2)Redirect(重定向):服务端发送给客户端一个重定向的临时响应头,这个响应头包含重定向之后的URL,客户端用新的URL重新向服务器发送一个新的请求。  

1、定义

 

    1Forward(请求转向):服务器程序内部请求转向,这个特性允许前一个程序用于处理请求,而后一个程序用来返回响应。

    2Redirect(重定向):服务端发送给客户端一个重定向的临时响应头,这个响应头包含重定向之后的URL,客户端用新的URL重新向服务器发送一个新的请求。

 

2、定义简单理解

 

   1)请求转发只是把请求转发给服务器上(通常是同一个Web应用中)的另一个组件(ServletJsp等)。

    2)重定向则只是告诉客户(浏览器)去访问另一个URL(可能是同一个Web站点甚至其他站点)。

 

3、本质区别

 

    1)请求转发发生在服务器端,由服务器(比如servlet)控制。

    2)重定向发生在客户端,由客户(通常是浏览器)控制。

 

4、请求和响应次数

 

    1)请求转发过程在同一个请求当中完成,只会返回一个响应。

    2)重定向过程则发生在两个不同的请求中,会返回两个不同响应。

 

5、基于第4点,进一步分析

 

    1)请求转发后可以在服务器端获取本次请求对象上保存的信息(比如在Servlet中将用户名保存到当前request对象中,转发给另一组件(如JSP)后,另一组件可以通过request对象取得用户名信息)。

    2)请求转发后,浏览器地址栏URL不会发生改变。

    3)重定向后则无法在服务器端获取第一次请求对象上保存的信息(比如还是在Servlet中将用户名保存到当前request对象中,并重定向到一个新的URL,然后在新URL指向的地址中(比如还是某个Servlet)就无法获取原先保存在第一个请求中的信息。很明显,用户名是保存在第一次请求的对象中,但并没有保存在本次(第二次)请求的对象中)。

    4)重定向后,浏览器地址栏URL变为新的URL(因为浏览器确实给新的URL发送了一个新的请求)。

 

6、服务器端调用的方法

 

    1)请求转发使用RequestDispatcher对象的forward()include()方法(他们的区别可参考:Servlet中请求转发时forword()include()的区别)。

    2)重定向则使用HttpServletResponse对象的sendRedirect()方法。

 

7、基于第6点,进一步分析

 

    1)RequestDispatcher对象是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,所以forward()include()本质来说是属于请求对象的方法,所以请求转发始终发生在一个请求当中。

    2)sendRedirect()方法HttpServletResponse对象的方法,即响应对象的方法。既然调用了响应对象的方法,就表示本次请求过程已经结束了,服务器即将向客户端返回本次请求的响应了。事实上,服务器确实返回了一个状态码为“302”,首部“Location”值为新的URL的响应。然后浏览器就会根据“Location”首部指定的URL,重新发起一次新的请求,转向这个目标页面,所以重定向实际上发生在两个不同的请求当中。

 

8、sendRedirect()forword()中使用相对URL分析(站点为http://localhost:8080/Web应用为MyApp)

 

    1)sendRedirect(URL):如果使用”/”开头,则表示相对于整个Web站点的根目录,如使用sendRedirect(“/foo/myHtml.html”)时,容器建立的完整URL为:http://localhost:8080/foo/myHtml.html。否则,就表示相对于当前目录。

    2)request.getRequestDispatcher(URL).forward(req,res):如果使用”/”开头,则表示相对于当前Web应用的根目录,而非整个Web站点的根目录,如使用request.getRequestDispatcher(/foo/myHtml.html).forward(req,res)时,容器会建立绝对(完整)的URL为:http://localhost:8080/MyApp/foo/myHtml.html否则,同样表示相对于当前目录。

 

9、跳转时机(有待考究

 

    1)请求转发执行到跳转语句后马上无条件跳转,之后的代码不再执行。

    2)重定向则会在所有代码执行完毕后跳转,但不能再向response中写入任何数据。(可以在重定向跳转后加上return语句,实现马上跳转)

 

10、执行时机(相同点)

 

    1)请求转发和重定向方法都必须在响应提交(刷新响应正文输出到流中)之前执行,否则会抛出IllegalStateException异常。

    2)在转发或重定向之前,响应缓冲区中未提交的数据会被自动清除。

 

11、响应速度(理论上)

 

    1)请求转发相对快:因为请求转发过程在同一请求中。

    2)重定向相对慢:因为重定向过程发生在两个不同的请求中。

 

Servlet中请求转发和重定向的原理及区别

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
servlet请求转发与重定向的区别: request.setAttribute("test","hello"); request.getRequestDispa
servlet请求转发与重定向的区别: request.setAttribute("test","hello"); request.getRequestDispa
一、请求转发:request.getRequestDispatcher("URL").forward(request,response); 二、重定向:resp
前言 在前面一片文章中笔者实现了一个简单的登录验证的功能,在验证中涉及到了两种页面 跳转的方式
前言 在前面一片文章中笔者实现了一个简单的登录验证的功能,在验证中涉及到了两种页面 跳转的方式
附上视频教学的一张图: 区别: 1.转发产生一次请求,一次响应; 重定向产生2次请求 两次响应 2.转
1、当request对象附带一个值的时候,重定向不适合用,只能用请求转发 也就是,servlet查询了的数据
需注意的是:所谓重定向是指:A.JSP页面发送请求到Servlet,Servlet再重定向到另一个B.JSP页面,这
上一篇博客简单的介绍了一下有关Servlet的知识,从宏观上能够了解Servlet是干嘛的,这篇就来谈一下
sendRedirect(String url)和请求转发都是servlet把请求转给另外的对象,那么他们有什么区别呢? 1
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号