2011-09-12 17 views
10

JSF 2.0アプリケーションでページ分割を行う最も効率的な方法は何ですか? 私はPrimefaces datatableを使用しており、コーディングを全く行わずに ページングを単独で実行するのに十分なインテリジェントです。効率的なJSFページネーション

<p:dataTable var="car" value="#{carBean.cars}" paginator="true" rows="10"> 
    <!-- Multiple columns here--> 
</p:dataTable> 

私が見ていることは、セッションスコープ以上に配置する必要があることです。

@ManagedBean 
@SessionScoped 
public class CarBean{ 
    public List<Car> getCars(){ 
     //return data from DB 
    } 
} 

これを実行する方法についてもう少し効率的な方法がありますか?

途中でEJB/JPAをバックエンドで使用しました。これについて詳しくは、リンクまたはチュートリアル を知りたいと思います。

ありがとうございました。

答えて

18

あなたは、クライアントが実際に見る必要があるメモリ内のみ行を持っているために、LazyDataModelを使用する必要があります。 See also the example in PrimeFaces showcase。これは、あなたが最終的に望むDBレベルのページネーションを行います。

リッチフェイスは、風味が同じで、ArrangableDataModel,here's the RichFaces showcase exampleのフレーバをサポートしています。

+0

こんにちはBalusC、これは素晴らしい提案です。私はこれを使用します。しかし、私はこのモデルが特有のものであることに気付きました。ちょうど私がJSFデータテーブルのみを使用している場合、どのようにこの場合にページネーションが行われているのですか?余計なご質問をおかけして申し訳ありません、私の好奇心を高めるだけです。私はビジネスロジックを扱うEJB/JPAを持っています。 –

+0

ヘルパー・ビーンに必要な定型文を書くだけでよいでしょう。 http://balusc.blogspot.com/2008/10/effective-datatable-paging-and-sorting.html(注:3歳の記事とJSF 1.2を対象にしています) – BalusC

+0

@BalusC、確かに。いくつかのヘルパー・ビーンのすべての定型文。なぜJSFはとても汎用的でなければならないのですか?そしてなぜJSFビルトインのdataTableコンポーネントに10年後に 'LazyDataModel'のようなものがないのでしょうか? –

1

Primefaceデータテーブルの組み込みの機能が優れた機能の1つであり、負荷テストを大量に行い、Hibernateエンティティが30,000を超えるレコードセットを取得し、パフォーマンスが低下していることがわかりました。これはもちろんセッション中に30,000のエンティティを持つことを意味するので、サーバ側にセッションを保存することによって私はweb.xmlに次のようなことができます。

<context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 

この

は、要求/応答のサイズが大幅にこれを行うことにより、非常に苦しむことができますが、サーバー側のメモリを削減することが可能にViewStateのサイズを小さくします。

ViewStatまたはセッション・メモリーの使用量を軽減するためのJSF実装のもう1つの可能性のあるオプションは圧縮です。次のリンクでは、設定可能ないくつかのSUN RIおよびMyFaces JSF構成パラメータについて説明します。その中には、セッション・ステートの圧縮オプションを指定するものがあります。 http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frweb_jsfengine.html

Primefaces DataTableページ分割機能がどのように機能するかを学ぶ限り、直接ソースに行くのはなぜですか? Primefacesは、すべてのオープンソースプロジェクトの後で、これだけのコードを見て、あなたが学ぶことができます参照してください:http://code.google.com/p/primefaces/source/browse/#svn%2Fprimefaces

0

使用しているPrimefaceのバージョンによって重要な注意があります。行選択機能を使用する場合は、3.0.M2から始まり、SelectableDataModelを実装する必要があります。これは多くのレガシーコードを破壊し、それについて多くの愚痴がありました。行うには

最も簡単な方法は、このような内部クラスを作成することです:

private MyDataModel dataModel = null; 

public MyDataModel getDataModel() { 
    if (dataModel != null) return dataModel; 
    dataModel = new MyDataModel(some list); 
    return dataModel; 
} 

public static class MyDataModel extends ListDataModel<SomeRecord> 
     implements SelectableDataModel<SomeRecord> { 

    MyDataModel(List<SomeRecord> source) { 
     super(source); 
    } 
etc. 

その後pまで属性:dataTableの#{} bean.dataModelになります。

幸運。

2

生産アプリケーションでは、遅延データモデルを使用して700,000レコードを処理しています。私は怠惰なdatatableの場合に修正を持っているM3を使用することをお勧めします。