読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

PrimeFacesのDataTableを探る ~DynamicColumnで明細リンク~

PrimeFaces JSF DataTable

「PrimeFacesのDataTableを探る」の3回目です。1,2回目はこちら。

ずっとDynamicColumnを利用してきてますが、デメリットも結構あるように感じます(^^;

なので動的に一覧のカラムが変動するケース以外はあまり使わないほうがいいかなと思っていたり。

具体的に、どんな点が使いづらいか?ですが、例えば、お客さんから

「ここのカラムの明細はさー、このページにリンクして、その情報を詳細に表示してほしいんだよねー」

みたいなとき、通常のcolumnを利用していれば、ちょちょいとcolumnタグ内部のコンポをcommandLinkとかにすればいいだけです。

これがDynamicColumnを利用していると、う…どうすればいいんだ…となったり。

自分達は以下のような形で、カラムを特定する処理を入れて、レンダリングをスイッチしてます。

バッキングビーンに以下のようなメソッドを追加します。

    /**
     * 書籍タイトルカラムかどうか.
     * @param model カラムモデル
     * @return 書籍タイトルカラムであればtrue/それ以外のカラムであればfalse
     */
    public boolean isColTitle(ColumnModel model){
    //普段はApacheCommonsLangのStringUtils.equalを使ってます
        if(model.getProperty().equals("title")){
            return true;
        }
        return false;
    }
    
    /**
     * リンクカラム以外かどうか.
     * @param model カラムモデル
     * @return リンクカラム以外であればtrue/リンクカラムであればfalse
     */
    public boolean isColNotLink(ColumnModel model){
        return !isColTitle(model);
    }

上記メソッドをEL式でrenderedと紐づけます。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form id="dtFrm">
            <p:dataTable id="dt" var="book" value="#{bookBean.bookList}"   
                sortMode="multiple">
                <p:columns id="colBook" var="col" value="#{bookBean.columns}"
                    sortBy="#{book[col.property]}">
                    <f:facet name="header">
                        #{col.header}
                    </f:facet>
                    <!-- 書籍タイトルをリンクにする -->
                    <h:commandLink value="#{book[col.property]}"
                                   rendered="#{bookBean.isColTitle(col)}" />
                    <!-- 書籍タイトル以外は文言だけ -->
                    <h:outputText value="#{book[col.property]}" 
                                  rendered="#{bookBean.isColNotLink(col)}"/>
                </p:columns>
            </p:dataTable>
        </h:form>
    </h:body>
</html>

これで、実行すると以下のようになって、一覧の書籍タイトルカラムの明細がcommandLinkとなります。DynamicColumnを使わざるを得ない場合には有用かなと(^^;

f:id:kikutaro777:20130331125949j:plain

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村