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

Jsf 读取primefaces数据表要显示的正确行数,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我有一个这样的数据表 <pf:dataTable id="#{controller.tableComponentId}" rows="#{controller.rowsPerPage}" rowsPerPageTemplate="#{controller.rowsPerPageTemplate}" <pf:ajax event="page" listener="#{controller.onPageChange}"/> /> 我

我有一个这样的数据表

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

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

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

我知道这个线程基本上是相同的问题。我尝试了这里提到的解决方案,但对我不起作用。我也使用分页,但为了简单起见,我没有把它放在我的代码中

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

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


数据表页
支持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;
    }
}
package org.antonu17;
导入org.omnifaces.cdi.ViewScoped;
导入org.omnifaces.util.Faces;
导入org.primefaces.event.data.PageEvent;
导入javax.faces.component.UIComponent;
导入javax.inject.Named;
导入java.io.Serializable;
导入java.util.List;
导入java.util.stream.collector;
导入java.util.stream.IntStream;
@命名(“datatablePage”)
@视域
公共类DatatablePage实现了可序列化{
私有字符串tableComponentId=“table”;
私有整数行=20;
私有字符串rowsPerPageTemplate=“20,30,40,50”;
private List List=IntStream.range(1200).boxed().collect(Collectors.toList());
公共无效onPageChange(PageEvent事件){
System.out.println(Faces.getRequestParameter(((UIComponent)event.getSource()).getClientId().concat(“_行”));
}
公共字符串getTableComponentId(){
返回tableComponentId;
}
public void setTableComponentId(字符串tableComponentId){
this.tableComponentId=tableComponentId;
}
公共整数getRows(){
返回行;
}
公共void集合行(整数行){
this.rows=行;
}
公共字符串getRowsPerPageTemplate(){
返回rowsPerPageTemplate;
}
公共void setRowsPerPageTemplate(字符串rowsPerPageTemplate){
this.rowsPerPageTemplate=rowsPerPageTemplate;
}
公共列表getList(){
退货清单;
}
}
在页面事件侦听器中获取行 第页:


数据表页
支持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;
    }
}
package org.antonu17;
导入org.omnifaces.cdi.ViewScoped;
导入org.omnifaces.util.Faces;
导入org.primefaces.event.data.PageEvent;
导入javax.faces.component.UIComponent;
导入javax.inject.Named;
导入java.io.Serializable;
导入java.util.List;
导入java.util.stream.collector;
导入java.util.stream.IntStream;
@命名(“datatablePage”)
@视域
公共类DatatablePage实现了可序列化{
私有字符串tableComponentId=“table”;
私有整数行=20;
私有字符串rowsPerPageTemplate=“20,30,40,50”;
private List List=IntStream.range(1200).boxed().collect(Collectors.toList());
公共无效onPageChange(PageEvent事件){
System.out.println(Faces.getRequestParameter(((UIComponent)event.getSource()).getClientId().concat(“_行”));
}
公共字符串getTableComponentId(){
返回tableComponentId;
}
public void setTableComponentId(字符串tableComponentId){
this.tableComponentId=tableComponentId;
}
公共整数getRows(){
返回行;
}
公共void集合行(整数行){
this.rows=行;
}
公共字符串getRowsPerPageTemplate(){
返回rowsPerPageTemplate;
}
公共void setRowsPerPageTemplate(字符串rowsPerPageTemplate){
this.rowsPerPageTemplate=rowsPerPageTemplate;
}
公共列表getList(){
退货清单;
}
}

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

这个链接中的问题是解释我的问题和解决方案


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

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

这个链接中的问题是解释我的问题和解决方案


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

在触发
onPageChange(PageEvent事件)
后,在RENDER_响应时触发rowsPerPage setter。如果您需要新行值,可以将其作为
Faces.getRequestParameter(((UIComponent)event.getSource()).getClientId().concat(“\u行”)
rowsPerPage setter在触发
onPageChange(PageEvent事件)
后在RENDER\u响应时触发。如果需要新行值,可以通过
Faces.getRequestParameter(((UIComponent)event.getSource()).getClientId().concat(“\u行”))获取该值。
我接受您的答案,因为它是原始问题的解决方案。谢谢,我接受你的回答,因为这是解决原来问题的办法。非常感谢。