渲染完整页面而不是“逐步”(使用struts 2 / tiles)

时间:2009-01-13 13:35:36

标签: struts2 tiles2

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

我试图解决的主要问题是,即使只有部分内容发生了变化,Firefox浏览器7也会闪烁/闪烁页面(firefox更加顺畅)。

如果我有一个页面:

HEADER

一些内容

FOOTER

“部分内容”区域仅在页面加载之间发生变化,FOOTER部分仍然会在填充页脚背景颜色之前闪烁白色背景。我认为这可能是通过让struts发送整个页面来加载足够快以消除“闪烁”。 现在FOOTER来自服务器比它之前的部件稍晚一点,所以它闪烁(在Internet Explorer中,firefox顺利显示页面)。

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

关于使用tile flush参数: 我试过了,它不能正常工作。我需要整个页面的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的可配置延迟大约100ms)?

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

我知道这不是万无一失的,网络延迟等可能会影响到这一点,但如果我可以立即得到所有输出的响应并且可能使用基于表的布局(IE可能只在表关闭后呈现表这可以合理地工作。

或者然后尝试将此切换到Firefox或者可能忘记所有关于这个小故障......

更新2

这开始打扰我,所以我做了一些调查。 如果我有一个普通的jsp页面(没有tile)缓冲工作(使用buffer属性),那么如果我有Thread.sleep(),那么如果页面大小低于缓冲区大小,那么整个页面会在两秒后呈现。 但是如果我在页面中使用了tile(如上例所示),我无法同时渲染页面(我甚至在所有tile-templates /“components”中都包含了page指令,没有帮助)。那么瓷砖可能会在某处冲洗响应?

此外,“有问题的瓷砖”是我的身体部分,其中包含一个struts:form标签。我用普通的form-tag替换它,它按照我想要的方式工作......

更新3

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

2 个答案:

答案 0 :(得分:1)

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

您可以通过简化标记和使用deflate压缩来尽可能地减少延迟,以保持有效负载大小,这是一件值得做的事情。另外,你可以确保你没有点击Flash Of Unstyled Content。但是你无法控制浏览器选择渲染的时间,缺少在JavaScript中完成所有这些操作所带来的所有缺点(即便如此,浏览器可能会慢慢重绘)。

(* - 或者您的客户/老板,如果有人提出这个“重要要求”,那么您的网站在某种程度上与网络上的其他每个页面的工作方式不同。)

答案 1 :(得分:0)

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

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

此外,如果输出缓冲区太大,它仍然会刷新。尝试增加缓冲区大小?

<%@ page language="java" buffer="500kb" autoFlush="false" %>