重定向和转发的区别及应用[通俗易懂]

重定向和转发的区别及应用[通俗易懂]重定向重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL,而当使用转发时,该URL会保持不变。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

重定向

重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。

sendRedirect()这个方法属于response的方法,当这个请求处理完之后,看到response.senRedirect(),将立即返回客户端,然后客户端再重新发送一个请求,去访问xx.jsp页面。

重定向流程为:客户端请求—-响应,遇到sendRedirect(),返回响应—-客户端再次请求xx.jsp页面—-响应。
这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。

总结一下:在response.sendRedirect(“xx.jsp”);里面是两个请求,两个响应,地址栏会发生改变。


public void doPost(HttpServletRequest request,HttpServletResponse response)
         throws ServletException,IOException
{ 
   
         response.setContentType("text/html; charset=gb2312");
         response.sendRedirect("/index.jsp");
}

转发

是在服务器端起作用,当使用forward()时, Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的 form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传 递.
但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在 后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过 response.setAttribute(“name”, name)来传至下一个页面.

转发后浏览器地址栏URL不变.


public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{ 
   
         response.setContentType("text/html; charset=gb2312");
         ServletContext sc = getServletContext();
         RequestDispatcher rd = null;
         rd = sc.getRequestDispatcher("/index.jsp");      //定向的页面
         rd.forward(request, response);
}

如何选择

怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。

(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.

综上,转发和重定向的区别 :
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196098.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • fsync操作

    fsync操作/*update需要刷磁盘的操作*/#0os_file_fsync_posix(file=20)at/data/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/os/os0file.cc:3081#10x000000000198c562inos_file_flush_func(file=20)at/data/mysql-boost-5.7.32/mysql-5.7.32/storage/innobase/os/os0file.c

    2022年5月31日
    47
  • [欧拉回路] hdu 3018 Ant Trip

    [欧拉回路] hdu 3018 Ant Trip

    2021年12月16日
    45
  • 工程师必备APP抓包技能

    工程师必备APP抓包技能奇技·指南一台上网电脑就能完成APP抓包分析一条龙服务。这是一篇APP抓包分析总结性文章,采用APP模拟器与Web调试代理工具组合玩法。从此APP抓包分析能力变得…

    2022年5月30日
    26
  • 电商网站开发语言_电商平台架构图

    电商网站开发语言_电商平台架构图现在有这么一个需求1,一个电商平台要做多语言支持,主要就是商品要支持多种语言,也就是说,有一个商品id为100,默认显示简体中文,当我点击英文版的时候就显示该id为100的英文版本。所有的商品多种语言的商品id是不会变的,会变的只是显示的语言变了而已。不能分为多个网站来使用。只能是在一个域名下。3.数据库应该如何设计?求大神们给点思路,谢谢回复内容:现在有这么一个需求1,一个电商平台要做多语言支持…

    2022年9月27日
    2
  • 第一个C# Winform实例

    第一个C# Winform实例前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入。VS版本VS20171:打开VS建立一个WInform项目。拉入两个控件,gr

    2022年7月2日
    30
  • springboot实战第五章-springboot基础

    springboot实战第五章-springboot基础

    2021年5月16日
    133

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号