读取要为primefaces数据表显示的正确行数

时间:2015-12-08 11:37:56

标签: jsf primefaces datatable

我有像这样的primafaces数据

 <pf:dataTable id="#{controller.tableComponentId}" 
     rows="#{controller.rowsPerPage}"
     rowsPerPageTemplate="#{controller.rowsPerPageTemplate}"

    <pf:ajax event="page" listener="#{controller.onPageChange}"/>
  />

我的问题是当用户更改要显示的行数时。页面事件被触发,但具有旧的行值。因此,如果行的初始值为10,则用户将其更改为25.我仍然读取值10,然后JSF调用rowsPerPage setter。

我知道这个帖子PrimeFaces dataTable: how to catch rows-per-page event?这基本上是同一个问题。我尝试了这里提到的解决方案,但它对我没有用。我也使用分页,但为了简单起见,我没有把它放在我的代码中。

我还尝试使用process =“@ form”并读取请求参数映射,但是在ajax请求中没有发送“dt_rppDD”值。还有其他任何建议吗?

2 个答案:

答案 0 :(得分:0)

在页面事件侦听器中获取行

页:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">

<h:head>
    <title>Datatable Page</title>
</h:head>

<h:body>
    <h:form>
        <p:dataTable id="#{datatablePage.tableComponentId}" rows="#{datatablePage.rows}" paginator="true"
                     rowsPerPageTemplate="#{datatablePage.rowsPerPageTemplate}" value="#{datatablePage.list}" var="row">
            <p:ajax event="page" listener="#{datatablePage.onPageChange}"/>
            <p:column>
                <h:outputText value="#{row}"/>
            </p:column>
        </p:dataTable>
    </h:form>
</h:body>
</html>

支持bean:

package org.antonu17;

import org.omnifaces.cdi.ViewScoped;
import org.omnifaces.util.Faces;
import org.primefaces.event.data.PageEvent;

import javax.faces.component.UIComponent;
import javax.inject.Named;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@Named("datatablePage")
@ViewScoped
public class DatatablePage implements Serializable {
    private String tableComponentId = "table";
    private Integer rows = 20;
    private String rowsPerPageTemplate = "20,30,40,50";

    private List<Integer> list = IntStream.range(1,200).boxed().collect(Collectors.toList());

    public void onPageChange(PageEvent event) {
        System.out.println(Faces.getRequestParameter(((UIComponent)event.getSource()).getClientId().concat("_rows")));
    }

    public String getTableComponentId() {
        return tableComponentId;
    }

    public void setTableComponentId(String tableComponentId) {
        this.tableComponentId = tableComponentId;
    }

    public Integer getRows() {
        return rows;
    }

    public void setRows(Integer rows) {
        this.rows = rows;
    }

    public String getRowsPerPageTemplate() {
        return rowsPerPageTemplate;
    }

    public void setRowsPerPageTemplate(String rowsPerPageTemplate) {
        this.rowsPerPageTemplate = rowsPerPageTemplate;
    }

    public List<Integer> getList() {
        return list;
    }
}

答案 1 :(得分:0)

我找到了解决问题的方法,但这与我提出的问题无关。由于我使用自己的PaginatorElementRenderer实现,JSF并没有使用我的类,而是默认的类。

此链接中的问题是解释我的问题和解决方案。

How to customize Pagination in Primefaces Data Table

由于我使用的是旧版本而不是5.1,我不得不使用反射来访问地图并设置我自己的类。