0

我有这样的代码,它向我显示了 10 行的表格,排序工作完美,但是当我单击下一页或最后一页时出现问题 - 没有发生任何事情。每页的行数也不起作用:(也许我的 JFS bean 应该是 @ManagedBean 而不是 @Named,或者范围不正确?

我正在使用:netbeans 7.3.1(glassFish 4 嵌入式)+ primeFaces 3.5

客户列表.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>

客户列表.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;
    }
}
}
4

2 回答 2

1

我也遇到了同样的延迟加载问题,请参考这个链接

我发现您第一次设置的列表大小的总数。

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

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

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

于 2013-10-21T04:53:22.923 回答
-3

你应该使用@SessionScoped而不是@RequestScoped

于 2014-04-03T09:57:42.297 回答