RequestDispatcher
'sforward()
和HttpServletResponse
'方法有什么区别sendRedirect()
?
任何人都可以用一个例子来解释这些方法的最佳用法和一个实时例子吗?
4 回答
重定向是一种发送回客户端的响应,而转发委托完全发生在服务器端,转发操作的结果返回给客户端,就好像它仅来自原始 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);
另一个很好的解释可以在这里找到:
sendRedirect() 和 forward() 之间的区别
SendRedirect ():
该方法在HttpServletResponse接口中声明
签名:void sendRedirect(String url)
此方法用于将客户端请求重定向到其他位置以进行进一步处理,新位置在不同的服务器或不同的上下文中可用。我们的 Web 容器处理此并使用浏览器传输请求,并且此请求在浏览器中显示为新的要求。有时这也称为客户端重定向。
Forward ():该方法在RequestDispatcher接口中声明。
签名:转发(ServletRequest 请求,ServletResponse 响应)
此方法用于将请求传递给同一服务器内的另一个资源进行进一步处理,另一个资源可以是任何 servlet、jsp 页面任何类型的文件。当我们调用 forward 方法将请求发送到时,此过程由 web 容器处理另一个没有通知客户端的资源,哪个资源将处理它在 requestDispatcher 对象上提到的请求,我们可以使用 ServletContext 或 Request 通过两种方式获得。这也称为服务器端重定向。
RequestDispatcher forward() 用于将相同的请求转发到另一个资源,而 ServletResponse sendRedirect() 是一个两步过程。在 sendRedirect() 中,Web 应用程序将带有状态代码 302(重定向)的响应返回给客户端,并带有用于发送请求的 URL。发送的请求是一个全新的请求。
B forward() 由容器内部处理,而 sednRedirect() 由浏览器处理。
C我们应该在同一个应用程序中访问资源时使用 forward(),因为它比需要额外网络调用的 sendRedirect() 方法更快。
D在 forward() 中,浏览器不知道实际的处理资源,地址栏中的 URL 保持不变,而在 sendRedirect() 中,地址栏中的 URL 更改为转发的资源。
E forward() 不能用于在另一个上下文中调用 servlet,我们只能在这种情况下使用 sendRedirect()。
只有当请求被转发到的另一个 servlet 位于同一个应用程序中时,我们才能使用请求调度程序。另一方面,如果两个 servlet 驻留在同一应用程序或不同应用程序中,则可以在这两种情况下使用发送重定向。
一个请求转发只将请求转发到同一个WEB应用组件,而重定向也可以重定向到不同应用资源中的同一个站点,甚至可以定向到一个绝对URL。
重定向可以看到目标页面的URL,页面URL转发只能看到第一次访问,毕竟有服务器在做这个工作。
调用者和被调用者对象之间的请求响应共享相同的请求和响应对象,重定向调用者和被调用者属于两个独立的访问请求和响应过程。
跳转后必须加上redirect返回,否则虽然跳转了页面,但是后面语句还要执行跳转,forwarding是执行跳转页面,后面的代码就不会执行了。