Как уменьшить полезную нагрузку запроса 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 со всеми данными текущей страницы. Как вы можете частично увидеть на изображении ниже.

enter image description here

Для больших таблиц с большим количеством данных это приводит к огромным запросам. Это не обязательно? Есть ли способ изменить это поведение?

Ответ 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".