Есть ли существенное техническое различие между отправкой JSF без AJAX и отправкой "@all" AJAX?
В JSF 2.0, есть ли существенная техническая разница между отправкой без AJAX, например, и отправкой "@all" AJAX, например?
Пользователь не будет воспринимать обновление страницы после отправки в стиле AJAX, но происходит ли что-либо еще технически значимое? Меньше ли данных отправляется обратно на сервер? Отличаются ли какие-либо элементы жизненного цикла JSF при отправке AJAX и не AJAX?
1 ответ
Технически, @all
медленнее, чем синхронный постбэк. Нет никакой разницы в рендеринге HTML во время ответа рендеринга, но в ответе ajax немного больше данных, потому что ответ ajax был отправлен как документ XML с обновленным HTML в виде блока CDATA. Следующие данные добавляются в ответ поверх всего вывода HTML:
<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="javax.faces.ViewRoot">
<![CDATA[
HTML output here.
]]>
</update>
<update id="javax.faces.ViewState">
<![CDATA[5778819104895950876:-4716773626508512118]]>
</update>
</changes>
</partial-response>
(вы можете увидеть это сами в разделе "Сеть" или "Сеть" набора инструментов веб-разработчика в Chrome/Firebug/IE9, который можно получить, нажав F12)
Таким образом, это всегда ~250 байтов больше, чем синхронный ответ. Кроме того, в постобработке есть некоторые издержки, потому что JavaScript должен анализировать весь этот HTML-код из XML-ответа и заменять его на DOM, хотя на быстрых машинах влияние на производительность в наши дни практически полностью незначительно.
Однако на практике @all
визуальнопоявляется быстрее, чем синхронный постбэк, потому что нет никакой возможности "флеш контента".
Обратите внимание, что @all
долго не поддерживали в PrimeFaces, потому что это "в корне неверно" (чтобы привести лидерство PrimeFaces), но после OmniFacesFullAjaxExceptionHandler
Лидер PrimeFaces изменил свое мнение и поддерживается PrimeFaces 3.2 и выше.