Рендеринг всей страницы, а не «постепенно» (с использованием struts 2/tiles)

StackOverflow https://stackoverflow.com/questions/438954

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

Итак, если у меня есть страница с:

ЗАГОЛОВОК

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

НИЖНИЙ ФОТЕР

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

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

Об использовании параметра сброса плиток:Я попробовал это, и это не работает так, как мне нужно.Мне нужен флеш-параметр для всей страницы.Я попробовал обычную директиву страницы 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 (без плиток), буферизация работала (с атрибутом буфера), так что, если бы у меня был мой Thread.sleep(), вся страница отображалась через две секунды, если размер страницы был ниже размера буфера.Но если бы я использовал плитки на странице (как в примере выше), я не смог бы одновременно отобразить страницу (я даже включил директиву страницы во все мои плитки-шаблоны/"компоненты", бесполезно).Значит, tiles, вероятно, куда-то сбрасывает ответ?

Более того, «проблемные плитки» представляли собой часть моего тела, содержащую тег struts:form.Я заменил его обычным тегом формы, и все заработало так, как я хотел...

ОБНОВЛЕНИЕ 3

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top