Как уменьшить полезную нагрузку запроса p: ajax во время, например, p: dataTable pagination
Я использую JSF 2.2 с Primefaces 5.1. Существует редактируемый формат, который можно использовать с возможностью разбивки на страницы.
<p:dataTable editMode="row"
editable="true"
value="#{usersBean.users}"
var="user" paginator="true" rows="20">
<p:ajax event="rowEditInit" onstart="handleRowEditInit(event,this);"/>
<p:column>
<p:rowEditor/>
</p:column>
<p:column headerText="Real name">
<p:cellEditor rendered="true">
<f:facet name="input">
<p:inputText value="#{user.realName}"/>
</f:facet>
<f:facet name="output">
<h:outputText value="#{user.realName}"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="User name">
<p:cellEditor>
<f:facet name="input">
<p:inputText value="#{user.userName}"/>
</f:facet>
<f:facet name="output">
<h:outputText value="#{user.userName}"/>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
Каждый раз, когда страница изменяется, datatable выполняет AJAX POST со всеми данными текущей страницы. Как вы можете частично увидеть на изображении ниже.
Для больших таблиц с большим количеством данных это приводит к огромным запросам. Это не обязательно? Есть ли способ изменить это поведение?
Ответы
Ответ 1
В самом деле, когда вы отправляете форму в HTML, по умолчанию каждый отдельный элемент ввода HTML будет отправлен как параметр запроса. Таким образом, компоненты PrimeFaces ajax предлагают атрибут partialSubmit="true"
, который затем отправляет только элементы ввода HTML, покрываемые атрибутом process
, который по умолчанию находится в пределах от <p:ajax>
до @this
и <p:commandXxx>
до @form
.
Итак, просто добавьте это в таблицу данных, чтобы оптимизировать производительность разбивки на страницы:
<p:ajax event="page" partialSubmit="true" />
И добавьте это в любую командную кнопку, которая должна только получить доступ к текущей строке в таблице данных (например, чтобы показать ее в диалоговом окне) для оптимизации производительности обработки действий:
<p:commandButton ... process="@this" partialSubmit="true" />
Вы также можете настроить его глобально через параметр ниже контекста в web.xml
:
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
И затем для случаев, когда вам действительно нужен полный submit, явно используйте partialSubmit="false"
.