h:dataTable
各カラム(td)に(CSSの)classを割り当てるには、h:dataTableのcolumnClassesに、各列のCSSをカンマ区切りで指定する。以下は5列分指定した例。
<h:dataTable value="#{foo.getList()}" var="item" styleClass="myTable" columnClasses="number,text,text,number,text">
h:columnのclass, styleClassを指定しても無視される。h:outputTextなどに指定すると、<span>が出力され、そこにclassが指定される。tdには指定されない。
PhaseListener
アプリ内のすべてのリクエストに適用する場合
PhaseListenerを実装したクラスを作る。
package sample;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class FooPhaseListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
// 目的の処理
}
@Override
public void beforePhase(PhaseEvent event) {
// 目的の処理
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
※ このクラスのプロパティに@Injectで他のオブジェクトを注入するのも可能な模様(GlassFish 4で動作確認)
作成したクラスをfaces-config.xmlで指定する。アノテーションによる登録はサポートされていない模様。
<lifecycle>
<phase-listener>sample.FooPhaseListener</phase-listener>
</lifecycle>
画面ごとにPhaseListenerを登録する。
f:phaseListenerタグを使う。このタグは、UIViewRootにPhaseListenerを登録する。
使用例
なお、上記例ではf:phaseListenerをh:commandButtonのコンテントに記述しているが、PhaseListenerはUIViewRootに登録されるそうなので( https://javaserverfaces.java.net/nonav/docs/2.2/vdldocs/facelets/index.html ) 、h:body直下とか、h:head直下に記述したほうが誤解がないように思われる。
また、上記サイトに実例があるとおり、Restore Viewフェーズでは呼ばれないようだ。