带分页的LazyDataModel,单击下一页或最后一页无效

时间:2013-10-20 20:41:16

标签: jsf primefaces datatable pagination lazydatamodel

我有这样的代码,它向我显示了10行的表格,排序工作完美,但是当我点击下一页或最后一页时我遇到了问题 - 什么都没发生。每页行数也不起作用:(也许我的JFS bean应该是@ManagedBean而不是@Named,或者范围可能是incorect?

我正在使用:netbeans 7.3.1(glassFish 4 embeded)+ primeFaces 3.5

customers_list.xhtml

<h:form id="form">
    <p:dataTable var="cust" value="#{CustomersList.customers}" paginator="true" rows="10"
                             paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                             rowsPerPageTemplate="5,10,15" selectionMode="single" selection="#{CustomersList.selectedCustomer}" id="customerTable" lazy="true">

    <p:ajax event="rowSelect" update=":form:display" oncomplete="customerDialog.show()" />

    <p:column headerText="Id" sortBy="#{cust.id}">
        <h:outputText value="#{cust.id}" />  
    </p:column>  

    //rest of view...

</h:form>

CustomersList.java

package pl.;

import pl..utils.LazyCustomerDataModel;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import org.primefaces.model.LazyDataModel;
import pl..entity.Customer;

/**
 *
 * @author 
 */
@Named(value = "CustomersList")
@RequestScoped
public class CustomersList {

@Inject
private CustomerSessionBean customerBean;
private Customer selectedCustomer;

public CustomersList() {
}

public LazyDataModel<Customer> getCustomers() {
    return new LazyCustomerDataModel(customerBean);
}

public Customer getSelectedCustomer() {
    return selectedCustomer;
}

public void setSelectedCustomer(Customer selectedCustomer) {
    this.selectedCustomer = selectedCustomer;
}
}

LazyCustomerDataModel.java

package pl..utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import pl..CustomerSessionBean;
import pl..entity.Customer;

/**
 *
 * @author
 */
public class LazyCustomerDataModel extends LazyDataModel<Customer> {

private CustomerSessionBean customerBean;
private List<Customer> datasource;

public LazyCustomerDataModel(CustomerSessionBean customerBean) {
    this.customerBean = customerBean;
}

@Override
public void setRowIndex(int rowIndex) {
    /*
     * The following is in ancestor (LazyDataModel):
     * this.rowIndex = rowIndex == -1 ? rowIndex : (rowIndex % pageSize);
     */
    if (rowIndex == -1 || getPageSize() == 0) {
        super.setRowIndex(-1);
    } else {
        super.setRowIndex(rowIndex % getPageSize());
    }
}

@Override
public Customer getRowData(String rowKey) {
    for (Customer customer : datasource) {
        if (customer.getName().equals(rowKey)) {
            return customer;
        }
    }

    return null;
}

@Override
public Object getRowKey(Customer customer) {
    return customer.getName();
}

@Override
public List<Customer> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {

    this.datasource = customerBean.getAllCustomers(first, pageSize);

    List<Customer> data = new ArrayList<>();

    //filter  
    for (Customer customer : datasource) {
        boolean match = true;

        for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
            try {
                String filterProperty = it.next();
                String filterValue = filters.get(filterProperty);
                String fieldValue = String.valueOf(customer.getClass().getField(filterProperty).get(customer));

                if (filterValue == null || fieldValue.startsWith(filterValue)) {
                    match = true;
                } else {
                    match = false;
                    break;
                }
            } catch (Exception e) {
                match = false;
            }
        }

        if (match) {
            data.add(customer);
        }
    }

    //sort
    if (sortField != null) {
        Collections.sort(data, new CustomerLazySorter(sortField, sortOrder));
    }

    //rowCount  
    int dataSize = data.size();
    this.setRowCount(dataSize);

    //paginate  
    if (dataSize > pageSize) {
        try {
            return data.subList(first, first + pageSize);
        } catch (IndexOutOfBoundsException e) {
            return data.subList(first, first + (dataSize % pageSize));
        }
    } else {
        return data;
    }
}
}

2 个答案:

答案 0 :(得分:1)

我也遇到了延迟加载的相同问题,请参阅this Link

我找到了您第一次设置的列表大小的总计数。

之前

this.datasource = customerBean.getAllCustomers(first, pageSize);

if(getRowCount()<=0){
    setRowCount(customerBean.getCustomersCount());
}

并从customerBean.getCustomersCount()获取客户数据库中记录数的总计数。

答案 1 :(得分:-3)

您应该使用@SessionScoped代替@RequestScoped

相关问题