response.sendRedirect() 和 request.getRequestDispatcher().forward(request,response) 有什么区别

新手上路,请多包涵

我在使用JAVA的时候出现了我的页面跳转的问题,如果我使用:

 response.sendRedirect("login.jsp")

然后我得到这个网址: http://localhost:8080/login.jsp

但是如果我使用

request.getRequestDispathcer("login.jsp").forward(request, response)

然后我得到这个 url: http://localhost:8080/Shopping/login.jsp (“购物”是我的模块的名称)。

有什么不同?

原文由 roger 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

为了简单地解释差异,

   response.sendRedirect("login.jsp");

不预先添加上下文路径(指的是捆绑了 servlet 的应用程序/模块)

但是,而

 request.getRequestDispathcer("login.jsp").forward(request, response);

将在相应应用程序的上下文路径前加上

此外, 重定向请求 用于将资源重定向到不同的服务器或域。这种控制转移任务由容器委托给浏览器。也就是说,重定向将标头发送回浏览器/客户端。此标头包含要由浏览器重定向的资源 url。然后浏览器向给定的 url 发起一个新的请求。

转发请求 用于转发到发出调用的服务器内的可用资源。这种控制转移是由容器在内部完成的,不涉及浏览器/客户端。

原文由 Keerthivasan 发布,翻译遵循 CC BY-SA 3.0 许可协议

forward() 和 sendRedirect() 方法之间的主要区别在于,在 forward() 的情况下,重定向发生在服务器端并且对客户端不可见,但在 sendRedirect() 的情况下,重定向发生在客户端,它对客户端可见。

Forward(ServletRequest request, ServletResponse response)sendRedirect(String url) 之间的其他区别是

向前():

  1. forward() 方法在服务器端执行。
  2. 请求被转移到同一服务器内的另一个资源。
  3. 它不依赖于客户端的请求协议,因为 forward () 方法由 servlet 容器提供。
  4. 该请求由目标资源共享。
  5. 此方法仅消耗一次调用。
  6. 它可以在服务器内使用。
  7. 我们看不到转发的消息,它是透明的。
  8. forward() 方法比 sendRedirect() 方法更快。
  9. 它在 RequestDispatcher 接口中声明。

发送重定向():

  1. sendRedirect() 方法在客户端执行。
  2. 请求被转移到另一个资源到不同的服务器。
  3. sendRedirect() 方法是在 HTTP 下提供的,因此它只能用于 HTTP 客户端。
  4. 为目标资源创建新请求。
  5. 消耗了两个请求和响应调用。
  6. 它可以在服务器内部和外部使用。
  7. 我们可以看到重定向地址,它是不透明的。
  8. sendRedirect() 方法较慢,因为在创建新请求时,旧请求对象会丢失。
  9. 它在 HttpServletResponse 中声明。

哪个好? 这取决于哪种方法更有用的场景。

如果您希望将控制权转移到新的服务器或上下文,并且将其视为一个全新的任务,那么我们可以使用 sendRedirect。通常,如果在浏览器重新加载网页时可以安全地重复操作并且不会影响结果,则应使用转发。

原文由 Maulik Kakadiya 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题