2012-02-10 2 views
3

У меня есть большая древовидная структура (почти 6000 узлов и рост), которую я показываю в своем веб-браузере как Richfaces rich: tree.JSF2 Richfaces 4.1.0 Частичная рендеринг дерева Ajax

Когда выбран узел, функция-обработчик в компоненте-бэбинге выполняет некоторую логику и выполняет некоторую магию.

Одна вещь, которая случается, заключается в том, что дерево перерисовывается с помощью Ajax-вызова для каждого выбора в дереве. Это означает, что более 2 МБ отправляется на сервер каждый раз, когда изменяется выбор.

Как вы могли догадаться, моя проблема здесь в том, что это очень медленно. То, что я хотел бы сделать, это только дерево-узел, который был выбран повторно, а не все дерево, так как это, надеюсь, просто POST на пару КБ на сервер.

Это мой первый реальный проект в JSF2.0 с использованием RichFaces 4.1.0, поэтому я искал как безумное решение и удалял документацию на сайте RichFaces, но еще не нашел решение.

Мой код выглядит следующим образом:

<h:form id="main"> 
<a4j:outputPanel ajaxRendered="true"> 
<rich:panel id="treePanel" header="Tree"> 
<rich:tree id="theTree" var="tree" value="#{treeBean.rootNodes}" selectionType="ajax" toggleType="client" selectionChangeListener="#{treeBean.selectionChanged}"> 
<rich:treeNode> 
<h:outputText styleClass="#{tree.selected?'selectedNode':''}" value="#{tree.title}" /> 
</rich:treeNode> 
</rich:tree> 
</rich:panel> 
</a4j:outputPanel> 
</h:form> 
+0

Вы нашли решение для частичного рендеринга узлов дерева. –

ответ

1

JSF приложения не работают как традиционные реализации Ajax в том, что у них есть что-то под названием ViewState, которая в основном совокупность всех необходимых контрольного пользователя данных, страница данных о состоянии , и другие данные, которые передаются обратно на сервер по каждому запросу и ответу. Причиной этого является то, что HTTP-связь по своей сути является апатридом, поэтому ViewState, предоставляемый серверу по запросу, сообщает серверу обо всех изменениях модели и вызванном событии сервера, которое должно произойти. Когда сервер завершит обработку этого запроса, он отправит свой встроенный ответ вместе с измененным ViewState обратно клиенту. Эта ViewState теперь содержит информацию о том, какие элементы страницы необходимо обновлять и обновлять визуально JSF javascripts.

Этот большой 2MB, вероятно, в основном состоит из вашего ViewState, потому что он существует исключительно на клиенте по умолчанию. Одним из потенциальных улучшений производительности, которые уменьшат пропускную способность и уменьшат ваш размер запроса/ответа, будет хранение ViewState на сервере. Вы можете включить это, добавив следующее в свой web.xml.

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 

Это должно уменьшить размер ViewState на клиенте, однако, что 2MB будет в конечном итоге будет храниться на сервере сессии в памяти сервера. Это увеличивает объем использования памяти на сервере, поэтому будьте в курсе и подготовлены к этому.

+0

Спасибо за ответ. Я на самом деле новичок в ViewState уже, и я храню его на сервере, как есть. Это была одна из первых вещей, которые я пробовал :-) Но она все равно подталкивает 2 МБ к серверу с каждым POST. – FighterHayabusa

+0

@FighterHayabusa Вы рассмотрели возможность сжатия GZIP на вашем веб-сервере? Каждый современный авторитетный браузер принимает его, и я обнаружил, что это значительное увеличение производительности, когда я занимаюсь большими страницами. –

+0

Не пробовал. Тем не менее, я не думаю, что это поможет с моей проблемой, так как время, затрачиваемое на это, толкает сервер, а не получает ответ. Я согласен с тем, что это хороший общий совет производительности :-) – FighterHayabusa

1

Большой ответ - это то, что вы устанавливаете AjaxRendered = "true" на панели вывода. В основном это говорит о том, что richfaces обновляет всю панель и все ее содержимое по каждому запросу ajax независимо от того, связано ли это с вашим деревом или нет. Вы можете удалить это.

Смежные вопросы