如何在例如期间减少 p:ajax 的请求负载p:dataTable 分页
How to decrease request payload of p:ajax during e.g. p:dataTable pagination
我正在使用 JSF 2.2 和 Primefaces 5.1。有一个启用分页的可编辑 primefaces 数据表。
<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>
每次更改页面时,数据表都会对当前页面的所有数据执行 AJAX POST。正如您在下图中部分看到的那样。
对于包含大量数据的大表,这会导致大量请求。这不是必需的吗?有没有办法改变这种行为?
确实,当您在 HTML 中提交表单时,默认情况下每个 HTML 输入元素都将作为请求参数发送。因此,PrimeFaces ajax 组件提供了 partialSubmit="true"
属性,该属性随后将 仅发送 HTML 被 process
属性覆盖的输入元素,这在 <p:ajax>
中默认为 @this
,在 <p:commandXxx>
中默认为 @form
。
因此,只需将此添加到数据中 table 以防优化分页性能:
<p:ajax event="page" partialSubmit="true" />
并将此添加到任何只需要访问数据中当前行的命令按钮table(例如,在对话框中显示它)以优化动作处理性能:
<p:commandButton ... process="@this" partialSubmit="true" />
您还可以通过 web.xml
中的上下文参数进行全局配置:
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
然后对于您确实需要完整提交的情况,请明确使用 partialSubmit="false"
。
我正在使用 JSF 2.2 和 Primefaces 5.1。有一个启用分页的可编辑 primefaces 数据表。
<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>
每次更改页面时,数据表都会对当前页面的所有数据执行 AJAX POST。正如您在下图中部分看到的那样。
对于包含大量数据的大表,这会导致大量请求。这不是必需的吗?有没有办法改变这种行为?
确实,当您在 HTML 中提交表单时,默认情况下每个 HTML 输入元素都将作为请求参数发送。因此,PrimeFaces ajax 组件提供了 partialSubmit="true"
属性,该属性随后将 仅发送 HTML 被 process
属性覆盖的输入元素,这在 <p:ajax>
中默认为 @this
,在 <p:commandXxx>
中默认为 @form
。
因此,只需将此添加到数据中 table 以防优化分页性能:
<p:ajax event="page" partialSubmit="true" />
并将此添加到任何只需要访问数据中当前行的命令按钮table(例如,在对话框中显示它)以优化动作处理性能:
<p:commandButton ... process="@this" partialSubmit="true" />
您还可以通过 web.xml
中的上下文参数进行全局配置:
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
然后对于您确实需要完整提交的情况,请明确使用 partialSubmit="false"
。