Java Servlet API中的forward()方法和redirect()方法的区别

forward():是容器中控制权的转让,在客户端浏览器地址栏不会显示转向后的地址。forward会将  request  statebean、等信息带到下一个jsp页面;使用getAttribute()来取得前一个jsp所放的信息。默认的都是采用forward方法。

redirect():重定向,浏览器将会得跳转的地址,并重新发送请求链接。从浏览器的地址栏里可以看到跳转后的地址信息。redirect()可以避免表单的重复提交,对当前页面进行刷新时只是相当于重新去数据库去了一次数据,而不是从新发送一个servlet请求。

所以前者更加高效,并且有助于隐藏实际的链接。但是却会带来表单的重复提交

而后者redirect等于客户端向服务器端发出两次request因此上一个jsp的信息不被保留。但是当我们需要重新定向到另一台服务器上面时,则必须使用redirect()方法来实现。


总结:技巧: 其实,通过浏览器就可以观察到服务器端使用了那种请求转发方式,当单机某一个超链接时,浏览器的地址栏会出现当前请求的地址,如果服务器端响应完成以后,发现地址栏的地址变了,则证明是间接的请求转发。相反,如果地址没有发生变化,则代表的是直接请求转发或者没有转发。

深入(分析理解)

转发过程

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。

重定向过程

客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。

浅出(表象)

转发

当用RequestDispatcher请求转发后,地址栏为http://localhost:8080/test/TestServlet
这真好应正了上面的分析,我们起初请求的就一个servlet,至于你服务器端怎么转,流程怎么样的,我客户端根本就不知道,我发了请求后我就等着响应,那你服务器那边愿意怎么转就怎么转,我客户端不关心也没法知道,所以当服务器端转发到jsp后,它把结果返回给客户端,客户端根本就不知道你这个结果是我真正访问的servlet产生的,还是由servlet转发后下一个组件产生的。

重定向

当用sendRedirect重定向后,地址栏为http://localhost:8080/test/student_list.jsp
因为这个时候,客户端已经知道了他第二次请求的是student_list.jsp,服务器已经告诉客户端要去访问student_list.jsp了,所以地址栏里会显示想要访问的结果。

总结

转发在服务器端完成的;重定向是在客户端完成的
转发的速度快;重定向速度慢

转发的是同一次请求;重定向是两次不同请求

转发不会执行转发后的代码;重定向会执行重定向之后的代码

转发地址栏没有变化;重定向地址栏有变化

转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成


Forward是在服务器端的跳转,就是客户端一个请求发给服务器,服务器直接将请求相关的参数的信息原封不动的传递到该服务器的其他jsp或servlet去处理,而sendredirect是在客户端的跳转,服务器会返回给客户端一个响应报头和新的URL地址,原来的参数什么的信息如果服务器端没有特别处理就不存在了,浏览器会访问新的URL所指向的servlet或jsp,这可能不是原先服务器上的webservce了。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子科技大学计算机读博好毕业,高产博士生读博一年达毕业要求:写论文不无聊...

(原标题:成电学子读博一年达毕业要求:写论文不无聊,别把挂科当潮流)扎在实验室写代码、跑数据的许潇突然成为全校谈论的焦点,一连串“牛”、“太强了”、“佩服”钻进耳朵。“21岁保研到成电(电子科技大学),22岁成为国…

数学入门题——《算法竞赛入门经典-训练指南》

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid94017#overview 代码链接:https://github.com/YvetteYue/ACM/tree/master/math%E5%85%A5%E9%97%A8 A题:UVA11388 GCD LCM 这道题求得是已知GCD和LCM 求最小的a情况下的a和b …

同步容器和并发容器的区别

同步容器:可以简单地理解为通过synchronized来实现同步的容器,如果有多个线程调用同步容器的方法,它们将会串行执行。比如Vector,Hashtable,以及Collections.synchronizedSet,synchronizedList等方法返回的…

当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?

总的思路:在浏览器地址栏键入URL,按下回车之后发生的几个事件: 1)浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址; 2)解析出IP地址后,根据该IP地址和默认端口80,和服务器建立…

上海音乐学院计算机考研难吗,上海音乐学院考研难吗?一般要什么水平才可以进入?...

问:从上海音乐学院毕业的学生就业怎么样?值不值得报考?答:想要了解更多毕业生就业情况见>>>就业报告汇集总之,上海音乐学院就业率相对来说是比较良好的,如果大家对此学校感兴趣的话,可…

Java-消息框显示两整数加减乘除

//两个整数加减乘除 //Qi Ming Liu,October 7,2015 import javax.swing.JOptionPane; public class Calculater { public static void main(String args[]) { //用户输入的两个数。 String firstNumber,secondNumber; //两个加数,以及和、差、积、商。 int numb…

DTO – 服务实现中的核心数据

最近实习,初接触项目,对好多的东西不是很清楚,看了下面的这篇博客对一个Web服务的实现中使用DTO及MO有了比较清楚的了解!!! http://www.cnblogs.com/loveis715/p/4379656.html 在三层模型中,ser…

Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

概要 学完了Map的全部内容,我们再回头开开Map的框架图。 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid…

计算机在社区健康档案管理中的作用,某社区卫生中心对辖区居民的健康档案信息进行电子化。一直建档居民的年龄范围在1..._考试资料网...

某社区卫生中心对辖区居民的健康档案信息进行电子化。一直建档居民的年龄范围在18岁以上,但某一份健康档案中的年龄却出现了15岁;某一份健康档案中所记录的心律为1000次/分,某一份健康档案中记录的性别伟男性,但在疾病中记录有子宫肌瘤。1.信…

Select count(*)和Count(1)的区别和执行效率比较

在MySQL中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以提升性能,给出的理由是Count( *)会带来全表…

html5语异性元素,异性的5句性暗示

茫茫人海,我们或者擦身而过,或者在不经意间相遇,相识,相知。在某些特定的时刻,一句话就足以决定一段缘分。1.今晚我一个人住。这是一句百分百的性暗示语言。今晚,显然是约定时间。一个人住,表明…

支付相关备忘

2015年10月9日 11:02:12 支付宝/微钱包等等可能在成功/失败回调多次 因此每一次处理的时候都要验证订单是否已经处理过了 如果订单是已经成功状态就丢弃回调, 如果订单是失败状态,或未成功状态就继续接受回调转载于:https://www.cnblogs.com/iLoveMyD/p/4863354.html

Spring@Autowired注解

import org.springframework.beans.factory.annotation.Autowired; public class Boss { Autowired private Car car; Autowired private Office office; … } 原来一直以为一个Autowired 注释就可以对所有的类成员变量、方法及构造函数进行自…

计算机重装系统后黑屏,电脑重装系统后开机黑屏怎么办

‍最近有用户反映自己在重装电脑系统后,开机出现了黑屏的现象,检查后发现硬件设备没有故障,那么是怎么回事呢?小编分析得出,这个问题应出在显卡上,有可能是显示器不支持该显卡显示的分辨率或者是重装系统后…

北大“四大疯人院”之说

本文转自自己看到的一个一篇文章,突然明白原来名校的学生真的并不是与生俱来比别人很厉害,而是一点一滴的积累,一点一滴的拼搏,持之以恒终成一极!!!那时候我开始慢慢明白,在这个世界…