シンプルなページャ

<< 戻る   トップ >>

なんとなく元気がない。事態の改善を多少なりとも期待しつつ、JSF / マネージドビーンについて書いておこう。

ブログ記事のページャをつくろうとしたところで各種豆の用法に混乱をきたしたわけだが、やはりきちんとセッションビーンとマネージドビーンを切り分けることでうまくいくようになった。"Beginning Java EE 6" の付録ではあえてセッションビーンのみで処理をしていて、それを真似て作っていたら困ってしまった。その例は CDI (Context and Dependency Injection) のサンプルも兼ねていて「CDI によって、EJB を JSF の "バッキング Bean" つぉいて使用できるようになり、Web 層とトランザクション層をシンプルに連携できます。マネージド Bean のような "グルーコード" を書く必要がなくなり、Java EE プラットホームが非常に簡潔になります。」とのことだ。

あらためてページャについて考えてみると、それは現在表示されているレコードの位置と、どれだけのレコードが表示されているかを把握し、その変更を要求するフォームが必要なことがわかる。もしかしてそれだけわかっていれば良いのではないか、と思って <h:inputText> が2つと <commandButton< があるだけのフォーム <h:form> を挿入した。そしてそれぞれと記事のリストをマネージドビーンのプロパティに結びつけた。

<h:form>
    <h:inputText value="#{articleBean.firstRecord}"/>件目から
    <h:inputText value="#{articleBean.recordSize}"/>件表示
    <h:commandButton value="更新"/>
</h:form>

<ui:repeat value="#{articleBean.articleList}" var="a">
    ... 記事の表示処理
</ui:repeat>

記事リストはマネージドビーンのゲッターによって得られるようにした。

    @EJB NanbanSessionBean nanbanSessionBean;
    
    int firstRecord;
    int recordSize;
    
    public List<Article> getArticleList() {
        return nanbanSessionBean.getArticles( firstRecord, recordSize );
    }

    // firstRecord と recordSize のゲッタ・セッタ

セッションビーンにはデータベースにアクセスするメソッドを記述。

    public List<Article> getArticles( int p, int n ) {
        return (List<Article>) em.createNamedQuery( "Article.findAll" ).setFirstResult( p ).setMaxResults( n ).getResultList();
    }

セッションビーンとバッキングビーンを兼ねると、プロパティ firstRecord と recordSize の値が複数のクライアントに対して共有されてしまう。ただしそれはセッションビーンをステートレスにしているせいだから、ステートフルにすればなんとかなる「はず」である (未確認)。ステートフルにするとサーバの資源をきっちり使うようになるので、そこまでするよりはリクエスト単位などウェブのアクセス単位でプロパティを管理するマネージドビーンを使ったほうがよいのではなかろうか。

うむ、少し元気が出てきた。


作成: 2014-06-04 12:47:19.0更新: 2014-06-04 12:47:19.0
http://museo-anonimo.jp/nanban/?id=1278,http://museo-anonimo.jp/nanban/tr/1278