RequestDispatcher.forward()和HttpServletResponse.sendRedirect()之间有什么区别?

时间:2011-08-28 10:03:04

标签: java servlets redirect forward

RequestDispatcher的{​​{1}}和forward()的{​​{1}}方法之间有什么区别?
任何人都可以通过实例解释这些方法的示例和最佳用法吗?

4 个答案:

答案 0 :(得分:16)

重定向是一种发送回客户端的响应,而转发委托则完全在服务器端进行,而转发操作的结果返回给客户端,就像它只来自原始URL一样。

另一个区别是前向委派只能用于应用程序内资源,而重定向 命令可以将客户端浏览器重定向到当前域之外。

示例:

// Sends a temporary redirect to the HTTP client. Only absolute URLs are allowed.
ServletResponse.sendRedirect(String location);


// Delegates one HttpRequest to another dynamic or static resource
HttpRequest.getRequestDispatcher("example.jsp").forward(request, response);


// Includes/enriches current response with another dynamic or static resource
HttpRequest.getRequestDispatcher("example.html").include(request, response);

<小时/> 另一个很好的解释可以在这里找到:
Difference between sendRedirect() and forward()

答案 1 :(得分:3)

SendRedirect ():
此方法在HttpServletResponse接口

中声明
  

签名:void sendRedirect(String url)

此方法用于将客户端请求重定向到其他位置以进行进一步处理,新位置可在不同服务器或不同上下文中使用。我们的Web容器处理此问题并使用浏览器传输请求,此请求在浏览器中可见作为一个新的要求。有时这也被称为客户端重定向。

转发(): 此方法在RequestDispatcher Interface中声明。

  

签名:转发(ServletRequest请求,ServletResponse响应)

此方法用于将请求传递给另一个资源以便在同一服务器内进一步处理,另一个资源可以是任何servlet,jsp页面任何类型的文件。当我们调用forward方法请求时,Web容器会处理这个过程被发送到另一个资源而没有通知客户端,哪个资源将处理requestDispatcher对象上提到的请求,我们可以通过两种方式使用ServletContext或Request来获取该请求。这也称为服务器端重定向。

A RequestDispatcher forward()用于将相同的请求转发到另一个资源,而ServletResponse sendRedirect()用于两个步骤。在sendRedirect()中,Web应用程序将响应返回给客户端,其状态代码为302(重定向),并带有URL以发送请求。发送的请求是一个全新的请求。

B forward()由容器内部处理,而sednRedirect()由浏览器处理。

C 我们应该在访问同一个应用程序中的资源时使用forward(),因为它比需要额外网络调用的sendRedirect()方法更快。

D 在forward()中,浏览器不知道实际的处理资源,地址栏中的URL保持不变,而在sendRedirect()地址栏中的URL更改为转发的资源。

E forward()不能用于在另一个上下文中调用servlet,在这种情况下我们只能使用sendRedirect()。

Details Explanation Here

答案 2 :(得分:3)

只有当转发请求的其他servlet位于同一个应用程序中时,我们才能使用请求调度程序。另一方面,如果两个servlet位于同一个应用程序或不同的应用程序中,则可以在两种情况下使用Send Redirect。

答案 3 :(得分:2)

请求仅转发请求转发到相同的WEB应用程序组件,重定向也可以重定向到不同应用程序资源中的同一站点,甚至可以定向到绝对URL。

重定向可以看到目标页面的URL,页面URL转发只能看到第一次访问,毕竟还有一台服务器要做的工作。

调用者和被调用者对象之间的请求响应共享相同的请求和响应对象,重定向调用者和被调用者属于两个单独的访问请求和响应过程。

跳转重定向返回后必须添加,否则跳过页面,还会执行跳转语句,转发执行跳转页面,以下代码不会被执行。