「PrimeFacesのDataTableを探る」の3回目です。1,2回目はこちら。
ずっとDynamicColumnを利用してきてますが、デメリットも結構あるように感じます(^^;
なので動的に一覧のカラムが変動するケース以外はあまり使わないほうがいいかなと思っていたり。
具体的に、どんな点が使いづらいか?ですが、例えば、お客さんから
「ここのカラムの明細はさー、このページにリンクして、その情報を詳細に表示してほしいんだよねー」
みたいなとき、通常のcolumnを利用していれば、ちょちょいとcolumnタグ内部のコンポをcommandLinkとかにすればいいだけです。
これがDynamicColumnを利用していると、う…どうすればいいんだ…となったり。
自分達は以下のような形で、カラムを特定する処理を入れて、レンダリングをスイッチしてます。
バッキングビーンに以下のようなメソッドを追加します。
書籍タイトルカラムかどうか.
@param model
@return
public boolean isColTitle(ColumnModel model){
if(model.getProperty().equals("title")){
return true;
}
return false;
}
リンクカラム以外かどうか.
@param model
@return
public boolean isColNotLink(ColumnModel model){
return !isColTitle(model);
}
上記メソッドをEL式でrenderedと紐づけます。
<?xml version='1.0' encoding='UTF-8' ?>
<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を使わざるを得ない場合には有用かなと(^^;