JavaEE/JSF

Last-modified: 2013-10-20 (日) 21:17:10

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フェーズでは呼ばれないようだ。