Рендеринг полной страницы, а не "постепенно" (используя распорки 2 / плитки) - PullRequest
1 голос
/ 13 января 2009

Есть ли способ получить распорки 2 (используя плитки), чтобы построить всю страницу перед отправкой в ​​браузер? Я не хочу, чтобы страница постепенно создавалась в браузере по одной части за раз.

Основная проблема, которую я пытаюсь решить, заключается в том, что Internet Explorer 7 мигает / мигает на странице, даже если изменяется только часть содержимого (Firefox делает это гораздо более плавно).

Так что если у меня есть страница с:

HEADER

некоторый контент

FOOTER

А область «некоторого содержимого» изменяется только между загрузками страницы, часть FOOTER по-прежнему мигает белым фоном перед заполнением его цветом фона нижнего колонтитула. Я подумал, что, возможно, получая распорки для отправки всей страницы, она будет загружаться достаточно быстро, чтобы устранить «моргание». Теперь нижний колонтитул поступает с сервера немного позже, чем его части, и поэтому мигает (в Internet Explorer Firefox отображает страницу плавно).

NB: это важное требование для сайта, и использование ajax для загрузки промежуточного контента отсутствует (как и фреймы или другие «хаки»). Сайт построен с использованием CSS, а не макета таблицы, возможно, мне придется использовать макет таблицы, чтобы заставить его работать ...

Об использовании параметра 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>

UPDATE

Спасибо за комментарии. Требование на самом деле почти разумно, так как это не обычная веб-страница, подумайте встроенная.

Но, очевидно, нет способа настроить IE для запуска рендеринга после некоторой задержки (например, Firefox имеет настраиваемую задержку около 100 мс)?

Я попытался перехватить TilesResult, но метод doExecute запускается до того, как все содержимое, по-видимому, будет оценено, поэтому метод уже завершился до оценки jsp (мой тест Thread.sleep ()). Мне было интересно, как я могу обработать весь ответ в строку и затем вывести его сразу в браузер.

Я знаю, что это небезопасно, и сетевые задержки и т. Д. Могут повлиять на это, но если бы я мог получить ответ на вывод сразу и, возможно, использовать макет на основе таблицы (IE, возможно, отображает таблицу только после закрытия таблицы ) это может работать разумно.

Или затем попытайтесь переключить это на Firefox или, может быть, забудете все об этом небольшом сбое ...

ОБНОВЛЕНИЕ 2

Это начало беспокоить меня, поэтому я провел небольшое расследование. Если у меня была обычная страница jsp (без плиток), буферизация работает (с атрибутом буфера), так что если у меня был мой Thread.sleep (), то вся страница отображалась через две секунды, если размер страницы был меньше размера буфера. Но если бы я использовал плитки на странице (как в примере выше), я не смог бы заставить страницу отображаться в одно и то же время (я даже включил директиву страницы во все мои плитки-шаблоны / "компоненты", никакой помощи). Значит, плитки, вероятно, сбрасывают ответ где-нибудь?

Кроме того, "проблемными плитками" была моя часть тела, которая содержала тег struts: form. Я заменил его на обычный тэг, и он работал, как я хотел ...

ОБНОВЛЕНИЕ 3

Ладно, похоже, никто не знает, как работает тайл или распорка тегов ... Нет больших проблем, так как это очень специфический случай и требование. Я работал над этим, используя apache в качестве прокси-сервера перед приложением, и используя параметры конфигурации прокси-сервера apache, чтобы указать большой буфер. Я отмечу это как ответ.

Ответы [ 2 ]

1 голос
/ 13 января 2009

Вы можете отправлять данные страницы одновременно на стороне сервера, если хотите (и многие фреймворки в любом случае делают это для удобства), но реальность работы с сетями заключается в том, что они не будут получены сразу, и браузер отобразит их как пакеты приходят. И это хорошо для отзывчивости, даже если вы * эстетически хотели бы, чтобы страница отображалась сразу.

Вы можете максимально уменьшить задержку, упрощая разметку и используя сжатие с раздувом для уменьшения размера полезной нагрузки, и в целом это стоит сделать. Кроме того, вы можете убедиться, что вы не включили флэш-память из неустановленного контента. Но вы не можете контролировать, когда браузер выбирает рендеринг, если не делать все это в JavaScript со всеми вытекающими отсюда недостатками (и даже в этом случае браузер может перерисовываться медленно).

(* - или ваш клиент / начальник, если именно он выдвинул это "важное требование", чтобы ваш сайт как-то работал по-другому, чем любая другая страница в сети.)

0 голосов
/ 13 января 2009

Можете ли вы использовать атрибут "flush" для компонентов тайлов?

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

Кроме того, если выходной буфер становится слишком большим, он все равно будет сброшен. Попробуйте увеличить размер буфера?

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