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

重定向和转发的区别及应用[通俗易懂]重定向重定向和转发有一个重要的不同:当使用转发时,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中存放的变量不会失效,就像把两个页面拼到了一起。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 交换机telnet配置

    交换机telnet配置

  • C++\QT常见面试题[通俗易懂]

    C++\QT常见面试题[通俗易懂]1.C与C++的区别2.深拷贝和浅拷贝的区别3.指针和引用的区别4.什么是面向对象,面向对象的三大特征是什么?5.static关键字的用法6.const关键字的用法7.什么是函数重载8.创建的对象有几种方式,有什么区别9.什么是构造函数10.什么是this指针11.抽象类是什么12.什么是封装、继承、多态13.私有继承,保护继承和公有继承的区别14.友元函数15.new和delete16.C++STL容器有哪些17.什么是面向对象编程的开放封闭原则?18.内联函数与宏的区

  • ThreadLocal

    ThreadLocal

  • 电流转电压模块4-20mA转0-3.3/5V/10V/15V转换变送器电路原理解析

    电流转电压模块4-20mA转0-3.3/5V/10V/15V转换变送器电路原理解析工业传感器常使用电流大小来传输数据,那么作为传感器数据的接收方,比如单片机,有内部AD的单片机可以检测电压的大小,那么首先必须将电流信号转换为电压信号,然后进行电压幅值变换使其适合MCU处理的电压范围。下面我们从设计的电流转电压的模块电路原理图来逐步解析。首先我们看电流检测放大部分,就是U1B部分,电流从R1的上端流入,下端流出。不难看出这是一个差分放大电路,也就是一个减…

  • pycharm连接mysql数据库代码_myeclipse连接数据库

    pycharm连接mysql数据库代码_myeclipse连接数据库PyCharm是一款常用的Python开发的软件,这里给大家介绍一下如何在PyCharm如何连接MySQL数据库。首先,我们需要找到页面中的DataBase窗口,一般在页面的右侧,没有显示的话,可以点击View->ToolWindows->DataBase。然后显示DataBase之后,我们点击DataBase。然后我们点击DataBase的这个+号。然后选择DataSource->MySQL。然后就显示到连接的页面,如果是第一次连接的时候,就需要点击下面的D

  • APP爬虫技术总结

    APP爬虫技术总结APP常用抓包技术-工具Charles,fiddler,burpsuite,PacketCapture等,具体操作可以查找百度-抓包方法 a.常规操作直接抓 b.使用Xposed+JustTrustMe关闭SSL证书验证抓包关闭SSL证书校验之前抓包

发表回复

您的电子邮箱地址不会被公开。

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