JSF2 Richfaces 4.1.0 Ajax частичная визуализация дерева - PullRequest
3 голосов
/ 10 февраля 2012

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

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

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

Как вы можете догадаться, моя проблема в том, что это очень медленно.То, что я хотел бы сделать, - это перерисовать только выбранный узел дерева, а не все дерево, так как, надеюсь, это всего лишь ПОСТУПАЕТ пару килобайт на сервер.

Это мой первый настоящий проектв 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>

Ответы [ 2 ]

1 голос
/ 08 июля 2014

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

1 голос
/ 10 февраля 2012

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

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

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

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

...