首页 > 解决方案 > 当您从 Java servlet 中转发 html 页面时,究竟发生了什么?

问题描述

据我了解,当您使用 RequestDispatcher 对象包装 servlet 并使用 forward() 方法时,您将委托该 servlet 来处理请求并产生响应。但是,当您包含一个 html 页面作为 getRequestDispatcher() 的参数时,究竟发生了什么?

这是来自甲骨文:

RequestDispatcher getRequestDispatcher(java.lang.String path) 返回一个 RequestDispatcher 对象,该对象充当位于给定路径的资源的包装器。RequestDispatcher 对象可用于将请求转发到资源或将资源包含在响应中。

https://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getRequestDispatcher(java.lang.String)

那么这个资源包含在http响应的什么地方,接收响应的页面怎么知道导航到这个页面呢?如果请求是使用 AJAX 发送的,那么该页面中的其余 JS 是否会在重定向到新页面之前执行?(即,如果我正在编写一个脚本来存储会话中响应的数据,这会在客户端导航到另一个页面之前执行吗?)

标签: javascriptjavaajaxservletsrequestdispatcher

解决方案


forward()表示将请求和响应对象传递给另一个 servlet 方法。

下一个 servlet 有 3 个选择:

  1. 填写响应并将其发送给客户端(即使客户端尝试使用前一个 servlet,它也会从最后一个 servlet 接收答案)
  2. 进行重定向,这意味着他向客户端发送一条消息,说请询问另一个 url 以便获得服务。
  3. 再次转发到另一个 servlet,循环再次开始。

如您所见,servlet 的重点是向客户端将要接收的响应写入一些内容。发生的情况forward()是,当控制移动到下一个 servlet 时,响应和请求对象的状态不会丢失。这意味着第一个 servlet 可以向请求对象写入内容,然后第二个 servlet 可以在同一个请求对象上写入新内容或编辑内容。

不过对于响应对象要小心。您可以通过 获取对作者的引用来写入响应response.getWritter()。如果第一个 servlet 使用该编写器写入内容,即使控件继续移动到第二个 servlet,客户端也会收到该消息。因此,您通常只编辑第一个 servlet 中的请求对象,然后第二个 servlet 写入响应对象。

如果您编写 html 代码,客户端将收到 html 响应。如果客户端使用浏览器,它将呈现网页。

Html 代码不会被打包为响应的资源文件。必须在该响应对象上编写 Html 代码,就像您在 java 中编写的对象的所有其他字段一样。


推荐阅读