Servlet(2)----------请求转发和重定向原理分析及区别
1、什么是请求转发?
将两个servlet配合在一起,形成一个工作流,完成用户的一个请求。
2、如何从AServlet跳到BServlet中
(代码实现) RequestDispatcher rd = request.getRequestDispatcher(目标servlet的url-pattern);
rd.forward(request,response);
3、请求转发的特点:
1)请求转发动作发生在服务器内部,地址栏不改变;
2)被请求转发连接的servlet处于同一个请求中。
4、request作用域:
作用:可以存储命名属性。name = value
如何使用request作用域传递数据:
---存:request.setAttribute(String name,Object obj);
---取:Object obj = request.getAttribute(String name);
5、request生命周期:
begin: 请求叨叨服务器创建
end: 响应回到客户端。
数据共享范围:一次请求有效。
6、请求重定向redirect
作用:可以在资源(两个servlet)之间做跳转
使用:response.sendRedirect(目标资源的URI)<带包名>
特点:
---请求动作发生在服务器外部,地址栏改变
---请求重定向连接的两个servlet,处于两次请求
原理:
原理(上图)解释:为什么说请求转发是一次请求,请求重定向是两次请求?
原因:转发请求:客户端发送http请求(r1), 此时web服务器接收请求在内部调用相关方法完成请求处理及转发操作(Aservlet中),此时(BServlet)接收r1处理后的结果,并发送给客户端;
请求重定向:客户端发送http请求(r1),此时web服务器接收到请求并响应302状态码和新的location地址,客户端收到响应后发现时302状态码和新的location地址,客户浏览得到新的指令后再次发出请求(r2,新的请求url是新的location),服务器根据新的请求寻找新的资源并响应客户端;
---->比如:一个人去银行分行办理业务,而这个业务他们不能够处理,但是他们告诉你,这个业务必须要去总部处理,所以你需要回家去总部处理,最后办理业务完成。
7、请求转发和重定向的使用时机:
1)请求转发(forward):有数据传递
如果两个servlet之间,需要传递大量的数据使用forward
2)请求重定向(redirect):没有数据需要传递或者只有少量的数据传递
如果两个servlet之间不需要传递任何数据,或者只有少量数据传递
8、两者的区别:
完成对象 | 请求次数 | 地址栏 | 服务器对象 | 速度 | |
请求转发 | 转发发生在服务器端 | 一次请求 | 不变 | 必须是同一台服务器 | 快 |
请求重定向 | 重定向发生在客户端 | 二次请求 | 改 变 | 可以是不同服务器 | 慢 |