【问题标题】:Servlet 3.0 include html pageServlet 3.0 包含 html 页面
【发布时间】:2011-03-07 16:33:21
【问题描述】:

我正在尝试使用 Servlet 3.0 API 实现以下行为:

  • 发送初始 html 页面
  • 发送更新页面的后续响应

这一切都有效,除了我可以发送初始页面而不提交响应的唯一方法是使用 HttpResponse Writer 手动编写...

我想知道是否有一种方法可以在 html 页面中使用类似于 RequestDispatcher#include 的内容,而不会遇到 AsyncContext 的问题。到目前为止我尝试过的一些事情并没有奏效:

  • 使用AsyncContext#dispatch:据我在网上看到的,它注定是为了将最终响应发送到容器以进行渲染
  • 使用 RequestDispatcher#forward:由于尝试在 OutputStream 中写入更多内容而出现 IllegalStateException
  • 使用RequestDispatcher#include:如果我在调用该方法之前初始化AsyncContext,request.isAsyncSupported返回true,调用该方法后返回false。我读到它调用了 flushBuffer() 并在响应中将提交标志设置为 true

此外,在 Servlet 3.0 规范中,有几行提到从异步 servlet 分派到普通 servlet 是可能的,但会提交答案。我相信静态 html 页面属于这一类...

如果您对如何在不影响仍将流式响应发送回客户端的能力的情况下完成优雅的包含有任何想法,请告诉我。

谢谢

【问题讨论】:

    标签: java html servlets include asynchronous


    【解决方案1】:

    在页面上使用存储数据的静态元素并使用 requestdispatcher。

    或者您也可以使用 response.setHeader("refresh", "5; URL=officer.html") 来简单地刷新整个页面。

    我真的不明白您需要在没有将响应提交给 servlet 的情况下发送多个请求。您是否尝试与服务线程多次交互?

    【讨论】:

      【解决方案2】:

      一种解决方案(不是唯一的一种):如果它只是一个 html 页面,则将 html 页面本身编写为 html 并对需要提供更新的 servlet 进行 ajax 调用。

      【讨论】:

      • 感谢您的回答。我正在尝试专门使用 Servlet 3.0 API 来实现服务器推送。所以,我只能发送异步响应。这将是对 servlet 的一次调用,并且 servlet 将返回多个响应(这是通过不提交响应来实现的,只是刷新它)。
      • 我还没有玩过异步 api。但是有atmosphere.dev.java.netcomet 实现!也许值得一看
      猜你喜欢
      • 2013-01-09
      • 2012-10-03
      • 2014-05-11
      • 2010-09-15
      • 2012-04-15
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多