HttpServletResponse接口的sendRedirect()方法和RequestDispatcher接口的forward()方法都可以利用另外的资源(Servlet,JSP页面或HTML文件)来为客户端进行服务,但是这两种方法有着本质上的区别。
sendRedirect()方法的工作原理图如下:
[img]http://dl.iteye.com/upload/attachment/181420/0a7698c4-fcac-3720-94d5-ab70c9825d85.jpg[/img]
上图交互过程如下:
(1)浏览器访问Servlet1;
(2)Servlet1想让Servlet2为客户端服务;
(3)Servlet1调用sendRedirect方法,将客户端的请求重定向到Servlet2;
(4)浏览器访问Serlvet2;
(5)Servlet2对客户端的请求作出响应;
从以上交互过程可以看出,调用sendRedirect方法,实际上是告诉浏览器Servlet2所在的位置,让浏览器重新访问Servlet2。调用sendRedirect方法,会在响应中设置location响应报头。要注意的是:这个过程对于用户是透明的,浏览器会自动完成新的访问。最终浏览器地址栏显示的URL是重定向后的URL。
forward()方法工作原理图如下:
[img]http://dl.iteye.com/upload/attachment/181429/54684d83-b4dc-32fe-83fe-2dc6c98a841f.jpg[/img]
上图交互过程如下:
(1)浏览器访问Servlet1;
(2)Servlet1想让Servlet2对客户端的请求进行响应,于是调用forward()方法,将请求转发给Servlet2进行处理;
(3)Servlet2对请求作出响应。
从以上交互过程可以看出,调用forward方法,对浏览器来是透明的,浏览器并不知道为其服务的Servlet已经换成了Servlet2,它只知道发出了一个请求,获得了一个响应,浏览器的地址栏中显示的URL还是原始请求的URL。
这两个方法还有一个区别:sendRedirect方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。
sendRedirect()方法的工作原理图如下:
[img]http://dl.iteye.com/upload/attachment/181420/0a7698c4-fcac-3720-94d5-ab70c9825d85.jpg[/img]
上图交互过程如下:
(1)浏览器访问Servlet1;
(2)Servlet1想让Servlet2为客户端服务;
(3)Servlet1调用sendRedirect方法,将客户端的请求重定向到Servlet2;
(4)浏览器访问Serlvet2;
(5)Servlet2对客户端的请求作出响应;
从以上交互过程可以看出,调用sendRedirect方法,实际上是告诉浏览器Servlet2所在的位置,让浏览器重新访问Servlet2。调用sendRedirect方法,会在响应中设置location响应报头。要注意的是:这个过程对于用户是透明的,浏览器会自动完成新的访问。最终浏览器地址栏显示的URL是重定向后的URL。
forward()方法工作原理图如下:
[img]http://dl.iteye.com/upload/attachment/181429/54684d83-b4dc-32fe-83fe-2dc6c98a841f.jpg[/img]
上图交互过程如下:
(1)浏览器访问Servlet1;
(2)Servlet1想让Servlet2对客户端的请求进行响应,于是调用forward()方法,将请求转发给Servlet2进行处理;
(3)Servlet2对请求作出响应。
从以上交互过程可以看出,调用forward方法,对浏览器来是透明的,浏览器并不知道为其服务的Servlet已经换成了Servlet2,它只知道发出了一个请求,获得了一个响应,浏览器的地址栏中显示的URL还是原始请求的URL。
这两个方法还有一个区别:sendRedirect方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。