0

私はそのようなコードを持っています.10行のテーブルが表示され、ソートは完全に機能しますが、次または最後のページをクリックすると問題が発生します-何も起こりません. ページあたりの行も機能しません:( JFS Bean は @Named ではなく @ManagedBean である必要があるか、スコープが正しくない可能性がありますか?

私が使用している: netbeans 7.3.1 (glassFish 4 埋め込み) + 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;
    }
}
}
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 に答える