文档章节

Response.sendRedirect()

KYZGJ
 KYZGJ
发布于 2014/04/14 00:49
字数 1611
阅读 352
收藏 0

一、用sendRedirect方法实现请求重定向

sendRedirect方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL。

RedirectServlet.java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirectServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            
        PrintWriter out = response.getWriter();
        
        // 1、写入到输出缓冲区中的内容还没有被真正传送到客户端,sendRedirect方法就可以被正确执行
        // 并且将输出缓冲区中原来或调用方法后写入的内容都清空,所以下面两条打印语句都不会显示
        out.println("before sendRedirect");
        
        response.sendRedirect(request.getContextPath() + "/test.html");
        // 与上面语句效果一样
        //response.sendRedirect("../test.html");
        
        // 相对URL以“/”开头,则相对于Tomcat的虚拟根目录,而不是相对于当前Web应用程序的根目录(虚拟目录)
        // 访问报404,URL是localhost:8888/test.html
        //response.sendRedirect("/test.html");
        out.println("after sendRedirect");
    }
}

在浏览器输入http://localhost:8888/testSendRedirect/servlet/RedirectServlet地址,页面显示为:

注意,此时的URL是test.hmtl本身的路径,而不是RedirectServlet的路径


二、请求重定向和请求充转发两者的区别

1、请求转发的运行流程

  • Web浏览器——————发出HTTP请求(到)——————Web容器;

  • Web浏览器    Web容器————首次访问,容器创建目标servlet————servlet(servlet1)

  • web容器创建请求对象和响应对象

  • web容器调用servlet1的service方法并将请求对象和响应对象传递给该方法

  • servlet1对象的service方法从请求对象中读取请求信息,这时也可以在响应对象中写入部分响应头和响应体数据

  • service方法向web容器发出forward命令表示要跳转到servlet2,web容器清空当前所写入的响应体内容,并调整请求头中的信息

  • web容器根据forward命令调用servlet2对象,如果初次访问则加载创建servlet2对象

  • web容器调用servlet2的service方法,并将请求对象和响应对象传递给该方法。注意,这里传递的还是调用servlet1时所创建的request和response对象

  • servlet2对象的service方法从请求对象中读取请求信息,并向响应对象中写入响应头和响应体信息

  • servlet2的service方法执行完毕后返回

  • servlet1的service方法继续执行调用forward方法的语句后面的代码,执行完毕后返回

  • web容器从响应对象中读取响应信息

  • web容器将响应信息发送给浏览器处理和显示,一次请求响应过程完全结束,request和response变成垃圾,等待垃圾回收器回收

2、请求重定向的运行流程

  • Web浏览器——————发出HTTP请求(到)——————Web容器;

  • Web浏览器    Web容器————首次访问,容器创建目标servlet————servlet(servlet1)

  • web容器创建请求对象和响应对象

  • web容器调用servlet1的service方法并将请求对象和响应对象传递给该方法

  • servlet1对象的service方法从请求对象中读取请求信息,并将包含重定向的响应头信息写入到响应对象中。

  • service方法执行完毕后返回

  • web容器从响应对象中读取响应信息

  • web容器把包含重定向的响应信息发送给浏览器。一次请求响应过程完全结束,request和response变成垃圾,等待垃圾回收器将其彻底从内存中清除。

  • web浏览器根据上次返回的重定向URL发出新的HTTP请求,这个请求甚至可以指向另外一个站点,web浏览器又开始一次全新的请求响应过程。

  • 如果请求资源为servlet并首次访问,web容器则加载和创建该servlet对象。

  • web容器创建请求对象和响应对象

  • web容器调用servlet2的service方法并将请求对象和响应对象传递给该方法

  • servlet2对象的service方法从请求对象中读取请求信息,并向响应消息对象中写入响应头和响应体消息

  • service方法执行完毕后返回

  • web容器从响应对象中读取响应信息

  • web容器将响应信息发送给浏览器处理和显示,新的请求响应过程完全结束,request和response变成垃圾,等待垃圾回收器回收

3、比较

  • forward方法只能将请求转发给同一个web应用中的组件;而sendRedirect方法不仅可以重定向到当前应用程序中的其他资源,还可以是同一个站点上的其他资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给sendRedirect方法的相对URL以“/”开头,它是相对于整个web站点的根目录(如果不指定则是以当前页面为相对路径);创建RequestDispatcher对象时指定的相对UR必须以“/”开头(不这样则报错),它是相对于当前web应用程序的根目录

  • 调用sendRedirect方法重定向的访问过程结束后,浏览器由初始的URL变为重定向目标的URL;而调用forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL

  • sendRedirect方法对浏览器的请求直接做出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为

  • forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

  • 无论forward方法还是sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓存区中已经有了一些内容,这些内容将被清除掉。


© 著作权归作者所有

KYZGJ
粉丝 6
博文 20
码字总数 27378
作品 0
广州
私信 提问
JSP页面跳转的几种方法以及注意点

最近自己在做项目时遇到一个问题,明明加了response.sendRedirect() ,系统也执行了,但是它就是不跳转;最后在网上找到原因如下: 首先我们要知道的是用response.sendRedirect做转向的原理,它其...

大黄有故事
2016/10/14
0
0
response.sendRedirect(request.getContextPath()+"/index.jsp"); 不跳转.firebug 已经get index.jsp 了,但得不到响应

response.sendRedirect(request.getContextPath()+"/index.jsp"); 不跳转.firebug 已经get index.jsp 了,但得不到响应 一个用户登出功能。点击退出,跳转到登录页.但是无法跳转, (没办法我就...

Sunmicro
2014/02/25
1K
2
redirect与forward跳转的区别

Servlet 跳转 redirect与forward跳转的区别 Servlet: 当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面。 一、原理 1) redirect 方式 response.sendRedirect("/a.jsp"); 页面的......

aolin
2016/03/07
45
0
一个response.sendRedirect(),重定向的问题

使用SpringMVC做控制 请求和控制, 其中有一个方法,在满足条件下做了一次response.sendRedirect("XXX.do")的重定向请求,结果在处理这个请求的方法中使用request.getsession.getAttribute("...

花间小酌
2013/07/20
7.6K
5
三种实现页面跳转的方法

response.sendRedirect("url")和request.getRequestDispatcher("url").forword(request,response)这两种方法都能实现页面的跳转,但是他们两者的本质是不一样的. 1.response.sendRedirect("ur......

Zero零_度
2016/03/31
42
0

没有更多内容

加载失败,请刷新页面

加载更多

面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
9分钟前
7
0
读书笔记:深入理解ES6 (八)

第八章 迭代器(Iterator)与生成器(Generator) 第1节 循环语句的问题   在循环、多重循环中,通过变量来跟踪数组索引的行为容易导致程序出错。迭代器的出现旨在消除这种复杂性,并减少循...

张森ZS
10分钟前
6
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
14分钟前
3
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
23分钟前
5
0
重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

导读:2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM...

阿里云官方博客
25分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部