1

有没有办法让 struts 2(使用磁贴)在将整个页面发送到浏览器之前构建整个页面?我不希望页面一次在浏览器中“逐步”构建。

我要解决的主要问题是,即使只有部分内容发生变化,Internet Explorer 7 也会闪烁/闪烁页面(Firefox 会更顺利地做到这一点)。

所以如果我有一个页面:

标题

一些内容

页脚

并且“一些内容”区域仅在页面加载之间发生变化,FOOTER 部分仍然闪烁白色背景,然后用页脚的背景颜色填充它。我坚持认为,也许通过让 struts 发送完整的页面,它的加载速度会足够快以消除“闪烁”。现在 FOOTER 来自服务器的时间比它之前的部分晚一点,所以它会闪烁(在 Internet Explorer 中,Firefox 可以流畅地显示页面)。

注意:这是网站的一项重要要求,使用 ajax 加载中间内容已经过时(框架或其他“黑客”也是如此)。该网站是使用 CSS 而不是表格布局构建的,也许我将不得不使用表格布局来让它工作......

关于使用 tiles flush 参数:我试过了,但它不能按我的需要工作。我需要整个页面的刷新参数。我已经尝试过正常的 jsp 页面指令“autoFlush=false”,但它不起作用。我在我的主模板页面上设置了这个指令(而不是在磁贴中)。

这是主模板中的一个示例,它使用页眉、正文和页脚模板。使用 Thread.sleep() 我添加的问题很容易发现。页脚的呈现时间比页面的其余部分晚 2 秒。

  <body>
  <div id="container">
  <t:insertAttribute name="header" flush="false" />

  <div id="content"><t:insertAttribute name="body" flush="false"/></div>

  <div class="clear"></div>
  <% Thread.sleep(2000); %>
  <t:insertAttribute name="footer" flush="false" />
  </div>
  </body>

更新

感谢您的评论。该要求实际上几乎是合理的,因为这不是一个普通的网页,认为是嵌入式的。

但显然没有办法配置 IE 在一些延迟后开始渲染(比如 Firefox 有大约 100 毫秒的可配置延迟)?

我试图拦截 TilesResult 但方法 doExecute 在显然评估整个内容之前运行,因此在评估 jsp 之前该方法已经退出(我的 Thread.sleep() 测试)。我想知道如何将整个响应呈现为字符串,然后一次将其全部输出到浏览器。

我知道这不是万无一失的,网络延迟等可能是其中的一个因素,但是如果我可以一次获得对输出的响应并且可能使用基于表格的布局(IE 可能仅在表格关闭后才呈现表格)这可能合理工作。

或者然后尝试将其切换到Firefox,或者可能忘记这个小故障......

更新 2

这开始困扰我,所以我做了一些调查。如果我有一个普通的 jsp 页面(没有图块),则缓冲工作(使用 buffer 属性),所以如果我有我的 Thread.sleep() 如果页面大小低于缓冲区大小,则在两秒钟后呈现整个页面。但是,如果我在页面中使用图块(如上面的示例),我无法同时渲染页面(我什至在我的所有图块模板/“组件”中都包含了页面指令,没有帮助)。所以瓷砖可能会在某处刷新响应?

此外,“有问题的瓷砖”是我的身体部分,其中包含一个 struts:form 标签。我用普通的表单标签替换了它,它可以按我的意愿工作......

更新 3

好的,似乎没有人知道瓷砖或支柱标签的内部工作原理......没有大问题,因为这是一个非常具体的案例和要求。我通过在应用程序前面使用 apache 作为 proxt 并使用 apache 的代理配置选项来指定一个大缓冲区来解决它。我会将其标记为已回答。

4

2 回答 2

1

如果您愿意,您可以在服务器端一次性发送所有页面数据(为了方便起见,许多框架无论如何都会这样做),但网络的现实是它不会一次全部到达,浏览器将在数据包到达时呈现它。这对于响应性来说是一件好事,即使您*在美学上希望页面一次显示所有内容。

您可以通过简化标记和使用 deflate 压缩来降​​低有效负载大小来尽可能减少延迟,这通常是值得做的事情。另外,您可以确保您没有遇到无样式内容的 Flash。但是您无法控制浏览器何时选择渲染,除非在 JavaScript 中完成所有操作,但会带来所有不利因素(即使那样,浏览器可能会缓慢重绘)。

(* - 或您的客户/老板,如果他们提出了这个“重要要求”,即您的网站以某种方式与网络上的所有其他页面不同。)

于 2009-01-13T15:41:28.080 回答
0

你可以在瓷砖组件上使用“flush”属性吗?

<tiles:insertAttribute name="body" flush="false"/>

此外,如果输出缓冲区变得太大,它无论如何都会刷新。尝试增加缓冲区大小?

<%@ page language="java" buffer="500kb" autoFlush="false" %>
于 2009-01-13T13:42:25.667 回答