【问题标题】:http streaming using java servlet使用 java servlet 的 http 流式传输
【发布时间】:2012-01-02 04:26:30
【问题描述】:

我有一个基于 servlet 的 Web 应用程序,它产生两组数据。网页中的一组数据是必需的,另一组是可选的。我想尽可能快地呈现基本数据,然后流式传输可选数据。我正在考虑将基本数据写入HttpServletRequest 的输出流,然后调用HttpServletRequest.flushBuffer() 将响应提交给客户端,但不要从 servlet 代码返回,而是创建可选数据,将其写入再次输出流,然后从 servlet 代码返回。 这个方案有哪些可能出错的地方?这是实现这一目标的标准做法吗?

【问题讨论】:

  • 是什么样的数据? HTML?
  • 是的,它是一个普通的 HTML 页面,包含 js、css 和 html。

标签: java http jakarta-ee servlets


【解决方案1】:

</head><body> 之间直接刷新响应缓冲区是有意义的,这样浏览器可以尽快检索对 JS/CSS 资源的引用。在servlet 中这样做是没有意义的,因为它是JSP,即supposed,用于生成HTML。

</head>
<% response.flushBuffer(); %>
<body>

(这是可以原谅使用 scriptlet 的 0.01% 情况之一,因为没有标签可以做到这一点;只有在 EL 2.2 中,您可以使用 ${pageContext.response.flushBuffer()}

但是,默认情况下,大多数 servlet 容器已经每 2KB 刷新一次缓冲区,这肯定会覆盖整个 &lt;head&gt; 在平均 webapp 上。您可以在服务器配置中微调响应缓冲区大小(有关详细信息,请参阅服务器文档)或在每个 JSP 的基础上使用以下方法:

<%@page buffer="1kb" %>

此外,在 HTML &lt;body&gt; 中刷新缓冲区几乎没有意义,因为您依赖于浏览器是否会呈现半生不熟的 HTML 正文。例如,MSIE 在&lt;/body&gt; 到达之前什么都不显示。

一个完全不同的替代方案是在页面完成加载时使用 JS/Ajax 在后台异步加载“可选”内容。例如。 (jQuery 风格):

$(function() {
    $("#somediv").load("somefragment.jsp");
});

另见:

【讨论】:

  • 我知道 Ajax 方法可能是最好的选择,但是只有一件事让我无法使用这种方法,那就是,如果我选择 Ajax 方法,我的请求数tomcat web server 会变成两次。而且我不确定这是否会出现一些基础架构问题。
  • 那么,像 CSS/JS/images 这样的资源请求不值得担心吗?抱歉,您的担心毫无意义。使用 ajax,带宽只是分配给 same 连接上的多个请求。测量就是知道。
  • 资源请求值得担心,这就是为什么它们由 akami 等 CDN 域提供服务。
【解决方案2】:

我会这样做:

  • 以普通 servlet + javascript 的形式返回基本数据,以执行 Ajax 调用可选数据。然后将显示基本数据,而无需等待可选数据。

因此 html 将如下所示:

<html>
   <body>
        essential data
        <javascript to do ajax call>
        essential data
   </body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2010-09-08
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多