【问题标题】:How to decrease request payload of p:ajax during e.g. p:dataTable pagination如何减少 p:ajax 的请求负载,例如p:dataTable 分页
【发布时间】:2015-06-19 09:31:10
【问题描述】:

我正在使用 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。如下图所示。

对于包含大量数据的大表,这会导致大量请求。这不是必须的吧?有没有办法改变这种行为?

【问题讨论】:

    标签: ajax performance jsf primefaces primefaces-datatable


    【解决方案1】:

    确实,当您以 HTML 格式提交表单时,默认情况下,每个 HTML 输入元素都将作为请求参数发送。因此,PrimeFaces ajax 组件提供了partialSubmit="true" 属性,该属性随后将仅发送process 属性覆盖的HTML 输入元素,默认在&lt;p:ajax&gt; 到@this 和&lt;p:commandXxx&gt; 到@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>
    

    然后对于您确实需要完整提交的情况,请明确使用partialSubmit="false"。

    【讨论】:

    • @BaslusC 我在p:dataTable 和p:dialog 周围有一个h:form。在数据表中,我注册了一个p:ajax 事件,单击一行以显示该对话框。此更改是否也会影响此类请求的执行?此处不编辑页面行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多