转发与重定向的区别

来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:53:22

转发与重定向的区别,这在求职中是一个经常被问到的问题。所谓转发,实际上是指下面这条语句:

   request.getRequestDispatcher("某地址").forward(request, response);

  它能将请求由一个Servlet转到另外一个Servlet,或者在JSP页面之间转向。另一种用得比较多的是重定向,它的代码如下:

  response.sendRedirect("某地址");

  从本质上来说,它们的区别在于是否生成响应。上面那句话在执行时,实际上是生成了一个临时响应,这个响应是一个用户无法看到的响应,状态码是300。浏览器在接收到这个响应后,不显示任何东西,而再次发出一个请求到重定向的响应所指定的地址上。因此,用户最后看到的最后结果并不是第一次请求过的地址,而是重定向后的地址产生的结果。而请求的转发则不同,它是将请求交给另外一个Servlet来处理,然后处理好的结果还是由原来的Servlet返回。

  在讲到这里时,我经常举的一个例子是买白菜的例子。

  我是一个程序员,但是你不知道,以为我是卖白菜的,来找我买白菜。那么,我有两种选择,一是我去菜市场找个卖白菜,一毛钱买进来,然后再两毛钱卖给你。在这个过程中,你自始至终都是跟我一个人打交道,你并不知道菜农的存在;二是我直接告诉你,你找错人了,你应该去找菜农,然后你找到菜农,也买到了白菜。

  在这个例子中,前者就是请求的转发,后者就是响应的重定向。前者是一个请求“买菜”,一个响应“菜给你”,但菜怎么来的你不用管。后者是两次请求,两次响应。先请求一次,然后响应告诉你找错了人,接下来再请求正确的人,最后直接拿到结果。

  总结一下,它们的区别有三点:
1、是否生成响应;
2、地址栏是否发生变化;
3、是否在同一个请求作用域中