一、解释请求转发与重定向的原理和效果:
形象解释:
情景:现在A同学要申请一个教师进行班级活动,有张老师和李主任两个人,A学生会先去找张老师申请教室。
1.请求转发:
A同学找到了张老师,然而张老师没法决定,所以张老师去找李主任,李主任同意,然后张老师通知A同学申请成功了。
2.重定向:
A同学去找张老师,张老师说:“我不管这个,你去找李主任吧”。所以A同学去找李主任,然后得到了审批。
在Java Web中,同学A就是用户端网页,张老师就是Servlet(服务器端),李主任就是其他资源,例如其他页面。
所以,请求转发其实是服务器操作,是有Servlet来负责转发请求并返回结果。
而重定向是服务器告诉客户端要访问的地址,然后客户端去访问这个页面,也就是客户端操作
二、请求转发:
请求转发能够保持数据,也就是说从 index.jsp (客户端)发送的数据经由Servlet发送给目标页面(假设为thanks.jsp)之后,能从 thanks.jsp 中取出index.jsp中发送的数据。
Servlet保持了客户端发来的数据,使得转发之后仍然能取出数据
因此,请求转发在数据传输效率上要高一些
实例:
设置请求转发:
将数据发送到 thanks.jsp:
1.可以看到,顶部的地址栏显示的Servlet名,而不是 thanks.jsp
这是因为,Servlet转发了请求到了thanks.jsp,然后返回给客户端,这个过程对于客户端是不可见的,就像学生A不知道张老师与李主任之间的过程一样
2.第二点:在thanks.jsp中仍然能够取得在 index.jsp中输入的数据,所以Servlet保持了数据
三、重定向:
客户端访问服务器之后,服务器给客户端返回一个信息,客户端根据这个信息再去找目标网页,所以其实相当于两次请求,因而第一次发送的数据在第二次发送时就会丢失。(就像学生A对张老师说的话还得再对李主任说一遍一样)
实例:
这次使用重定向的方式:
response.sendRedirect("/thanks.jsp");
点击发送请求,结果:
结果分析:
1.这里访问到了 thanks.jsp,所以可以确认的确重定向到了 thanks.jsp
2.正是因为数据没有传过来,所以全是 null ,在 thanks.jsp中处理数据时就出现了 空指针错误。
(用之前的例子来说:同学A从张老师那里转到了李主任,却忘了自己要说什么 )
四、使用情景
请求转发:
- 在用户登录时使用请求转发时,维持数据以进行检测
重定向:
- 在用户注销时返回主页面时,丢失数据从而退出当前账户
讲的不错的参考博客:
https://blog.csdn.net/qq_41376740/article/details/81064385
https://blog.csdn.net/bailu66/article/details/6914384