当您从 Java servlet 中转发 html 页面时,究竟发生了啥? [复制]

Posted

技术标签:

【中文标题】当您从 Java servlet 中转发 html 页面时,究竟发生了啥? [复制]【英文标题】:What exactly is happening when you forward an html page from within a Java servlet? [duplicate]当您从 Java servlet 中转发 html 页面时,究竟发生了什么? [复制] 【发布时间】:2021-06-09 23:54:49 【问题描述】:

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

这是来自甲骨文:

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

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

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

【问题讨论】:

Ctrl+F "Sending a redirect from servlet" in abovelinked duplicate. 【参考方案1】:

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

下一个 servlet 有 3 个选择:

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

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

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

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

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

【讨论】:

但是,如果包含 html 文件本身的路径会发生什么?即 request.getRequestDispatcher("/index.html").forward(request, response)? 它不会像您想象的那样运行。 getRequestDispatcher("/index.html") 需要一个路径作为参数。所以它会找到要处理该路径/index.html的servlet,然后将请求转发到该servlet

以上是关于当您从 Java servlet 中转发 html 页面时,究竟发生了啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java web.xml - 如何为任何不匹配的请求执行一个包罗万象的 servlet 以转发到 index.html?

jsp初识servlet转发转发与重定向的比较

关于请求转发重定向url重写

当您从机器 C SSH 进入 ssh 隧道 B->A 时,私钥会发生啥情况?

[Java][Web] Servlet中转发和重定向比较

jsp页面转发到servlet