p:dataTable中的数据过多导致行/单元格编辑提交中断

时间:2015-08-04 02:32:14

标签: jsf post primefaces datatable get

我一直在使用数据表来允许用户输入和编辑大量数据,但是发现一旦达到大量(但不确定)的列和行数量,表单将无法提交,并且所有与服务器的通信形式被切断(不相关的按钮,ajax等),直到执行页面刷新。

这是我的计算机/浏览器的限制,还是对可以在数据表中显示的最大可编辑数据量有硬编码限制?这可能是因为表单中输入字段数量的最大限制吗?

是我的数据表使用paginator的唯一解决方案吗?

以下是一个示例,如果行/列太多,将无法编辑(对我来说)。

<h:form>
  <p:dataTable var="_var" value="#{bean.values}" editable="true">

    <p:column headerText="Value">
      <p:cellEditor>
        <f:facet name="output"><h:outputText value="#{_var.value}" /></f:facet>
        <f:facet name="input"><p:inputText value="#{_var.value}" /></f:facet>
      </p:cellEditor>
    </p:column>

    <!-- Copy and paste this^ column 15 times -->

    <p:column>
      <p:rowEditor />
    </p:column>
  </p:dataTable>
</h:form>

3 个答案:

答案 0 :(得分:3)

使用行或单元格编辑器时,请指示cellEdit事件使用partialSubmit="true"

<p:dataTable ... editable="true">
    <p:ajax event="cellEdit" process="@this" partialSubmit="true" />
    ...
</p:dataTable>

这将仅发送process属性(行或单元本身)覆盖的输入字段,而不是每个输入字段。

另见:

答案 1 :(得分:2)

好的,我找到了solution

显然每个输入都是作为GET / POST参数发送的,服务器上的默认限制为512,以防止DoS攻击。

不幸的是,Primefaces似乎没有显示这个错误,因此很难找到 编辑:如果日志记录设置为正确级别,则显示错误。该错误也会显示在F12开发人员工具调试日志中。

简而言之,您必须转到服务器standalone.xml并添加:

  <property name="org.apache.tomcat.util.http.Parameters.MAX_COUNT" value="10000"/>

<system-properties>

修改

我拒绝放弃比发送数千个参数更好的解决方案,并重新审视了这个问题。

似乎在<p:ajax partialSubmitFilter="">属性中添加了PrimeFaces 5.2,它允许过滤您想要的输入。这对我来说没有用,因为我无法使用此功能将提交的数据缩小到行。

相反,我决定覆盖PrimeFaces.ajax.Request.send函数,如下所示:

var pfsend = PrimeFaces.ajax.Request.send;
PrimeFaces.ajax.Request.send = function(cfg) {
    if (cfg.event === 'rowEdit' || cfg.event === 'rowEditCancel') {
        // This is an operation on a datatable row. Filter for only that row
        cfg.partialSubmitFilter = '[data-ri=' + cfg.ext.params[0].value + '] :input';
    }
    pfsend(cfg); // Run the original function
};

通过这种方式,cfg的第一个参数(即正在编辑的行)的值被用作查找属性data-ri设置为该值(行)的元素的值。

请注意,此 要求您使用primefaces 5.2,但对于旧版本,可以通过覆盖整个包来实现相同的操作,并在相同功能的正确位置策略性地放置相似的行(请注意,cfg.partialSubmitFilter将不存在)。

答案 2 :(得分:1)

我找到了更优雅的解决方案,没有覆盖PrimeFaces.ajax.Request.send函数,但仍然只在rowEdit事件上发生。 首先,定义javascript函数:

<Enter>

然后在onstart回调中调用它:

function sendOnlyEditedRow(cfg) {
   cfg.partialSubmitFilter = "[data-ri=" + cfg.ext.params[0].value + "] :input";
}