4

JSF2.0、Spring3、および Hibernate4 を使用するアプリケーションがあります。

Primefaces 3.4.2 データテーブルに値を表示しています。問題は、ページネーションをクリックすると、データテーブルの行が常に最初の 10 レコードに残ることです。次の 10 レコードは表示されません。

私のデータテーブルコード

<h:form>
        <p:dataTable id="dataTable" var="req" value="#{reqMB.myList}"
            paginator="true" rows="10"
            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="5,10,15">
            <f:facet name="header">          

        </f:facet>
            <p:column>
                <f:facet name="header">
                    <h:outputText value="XXX" />
                </f:facet>
                <h:outputText value="#{req.bbbb}" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="XXXXS" />
                </f:facet>
                <h:outputText value="#{req.kkjj}" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="XXXXXOO" />
                </f:facet>
                <h:outputText value="#{req.nnnn}" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="XXXXKK" />
                </f:facet>
                <h:outputText value="#{req.kkkk}" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="XKKKK" />
                </f:facet>
                <h:outputText value="#{req.pppp}" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="LLLL" />
                </f:facet>
                <h:outputText value="#{req.llll}" />
            </p:column>
        </p:dataTable>
    </h:form>

ManagedBean

@Named("reqMB")
@Scope("request")
public class MyBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    MyService myService;

    List<MyClass> myList;


    public List<MyClass> getMyList() {
        try {
            myList= new ArrayList<MyClass>();
            myList.addAll(getMyService().getMymethod());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return myList;
    }

この問題を解決するにはどうすればよいですか?

更新 1

少数のレコードを表示するとページネーションは正常に機能しますが、1300 を超えるレコードを表示するとページネーションが機能しないことに気付きました。

4

2 に答える 2

2

問題は、この方法で使用するときに毎回データテーブルを作成していることです:

public List<MyClass> getMyList() { 
  ...
  myList= new ArrayList<MyClass>();
  ...
}

最初の myList 属性を初期化する必要があります。たとえば、 @PostContruct を使用できます

@PostConstruct
public void init() {
   myList= new ArrayList<MyClass>();
}

次に、次を使用できます。

public List<MyClass> getMyList() { 
   return myList
}

これは、Lazy データテーブルでも機能します

于 2013-05-03T03:48:38.880 に答える
2

私はちょうど30000レコードを試しましたが、うまくいきました。ただし、注目に値することの 1 つは、getMyList メソッドが何度も呼び出され (私の場合、レンダリング応答フェーズで 6 回)、Bean が呼び出されるたびに新しいリストをフェッチ/生成することです。問題(ゲッターメソッドで新しいリストを生成しようとしましたが、うまくいきました)。

一般的に言えば、そこにはビジネス ロジック関連のコードを配置しないことをお勧めします。代わりに、多くの場合、 @PostConstruct メソッドまたは別の場所にリストを設定する方がよいでしょう。BalusC の投稿をご覧ください。参考になるかもしれません。 JSF がゲッターを複数回呼び出す理由 また、遅延読み込みについてはこちらを参照してください 効率的な JSF ページネーション

以下は私のテストコードです:

<h:body>
    <h:form>
        <p:dataTable id="dataTable" var="car" value="#{tableBean.cars}"
                     paginator="true" rows="10"
                     paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                     rowsPerPageTemplate="5,10,15">
            <f:facet name="header">
                Ajax Pagination
            </f:facet>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Model" />
                </f:facet>
                <h:outputText value="#{car.model}" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Manufacturer" />
                </f:facet>
                <h:outputText value="#{car.manufacturer}" />
            </p:column>

            <p:column>
                <f:facet name="header">
                    <h:outputText value="Other Information" />
                </f:facet>
                <h:outputText value="#{car.otherInformation}" />
            </p:column>
        </p:dataTable>
    </h:form>
    <ui:debug hotkey="x"/>
</h:body>

そして、これはバッキング Bean です。

@ManagedBean
@RequestScoped
public class TableBean implements Serializable {

    private List<Car> cars;

    @PostConstruct
    public void init() {
        System.out.println("A new backing bean has been created");
        cars = new ArrayList<Car>();
        populateRandomCars(cars, 300000);
    }

    private void populateRandomCars(List<Car> list, int size) {
        for (int i = 0; i < size; i++) {
            list.add(new Car(i, i, UUID.randomUUID().toString()));
        }
    }

    public List<Car> getCars() {
//If i populate the list here I can still get the correct result.
//        cars = new ArrayList<Car>();
//        populateRandomCars(cars, 30000);
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }
}

そして最後にモデルクラス:

public class Car {
    private int manufacturer;
    private int model;
    private String otherInformation;

    public Car(int manufacturer, int model, String otherInformation){
        this.manufacturer = manufacturer;
        this.model = model;
        this.otherInformation = otherInformation;
    } 

    //Getters and Setters 
}
于 2012-12-19T08:59:49.013 に答える