一、重定向和请求转发的概念
以C/S模式为例:
请求转发:
request.getRequestDispatcher(URL).forward(request, response);
1.客户端发送请求数据给服务器
2.服务器接收请求数据并调用第一个servlet处理逻辑
3.第一个servlet处理数据结束后将数据传递给下一个servlet
4.第二个servlet处理完数据后调用forward()方法将处理结果返回给客户端。
请求转发的特点:客户端发送一次请求,请求数据流转多个servlet(一次请求,多个servlet联动),地址栏中只会出现第一次跳转的地址。
请求转发从发送请求中就已经准备好进行数据流转了即流转数据存在于HTTP请求报头中。
重定向:
response.sendRedirect(URL);
1.客户端发送请求数据给服务器
2.服务器接收请求数据并调用servlet处理逻辑
3.服务器调用sendRedirect()方法将处理结果放进HTTP响应报头中返回给客户端
4.客户端收到响应结果后再次发送请求数据给服务器,重复上述过程。
重定向的特点:客户端会多次发送请求给服务器。
重定向在向客户端返回处理结果时才决定让客户端再一次发送一次请求。
二、请求转发和重定向的区别
共同点:两种方式都可以实现浏览器页面的跳转
不同点:
1、数据共享问题
请求转发的数据处理是在一次请求中,使用request对象可以实现数据共享。
重定向是两次向客户端发送请求,想要让两次请求数据共享必须使用session对象。
2、效率问题
请求转发的效率高于重定向。这是因为请求转发是在服务器中跳转页面,而重定向需要重新再发送请求给服务器调用新的servlet来完成跳转页面。
3、页面跳转意图所在之处问题
两者都是在servlet处理数据结束后开始跳转页面的。请求转发和重定向两者的根本区别是由于RequestDispatcher().forward()方法和sendRedirect()方法的不同导致的,前者属于HttpServletRequest的方法,属于请求中的方法;后者属于HttpServletResponse的方法,属于响应的方法,所以请求转发在发送请求时就要求联动servlet,而重定向是在准备返回处理结果时要求再一次重发请求。
三、请求转发和重定向的使用时机
首先要明确,请求转发在每次刷新时会重新向服务器发送请求,每刷新一次,就重新发送一次请求。
1、对于表单数据,在表单数据需要修改时往往不能重复提交,此时需要重定向(刷新会导致数据源提交出现问题)。
2、判断请求数据能否在一次请求中被处理或者判断请求数据要放到request对象中还是session中,根据数据的生存期来判断以何种方式进行页面跳转。