JSF2.0とJSTLの連携

今回はJSF2.0とJSTLとの連携です。

余談ですが、今回からJDKGlassfish
最新版にしてみました。

【前提条件】

[環境]

【概要】

今回はJSTLのうちタグを使ってみます。

JSTLで変数を参照する際、
変数を参照する時には「$」を使用していました。
JSF2.0と連携する場合、JSF2.0の「#」を使った書き方で使用できます。

サンプルは選んだリンクによって、
ヘッダ・コンテンツ・フッタの表示/非表示を制御するプログラムです。

【サンプルコード】

ManagedBean

まずはManagedBeanからです。

@ManagedBean(name = "jstlSample")
@RequestScoped
public class JstlSample {

    private boolean viewHeader = false;
    private boolean viewContent = false;
    private boolean viewFooter = false;

    public String init(final boolean viewHeader, final boolean viewContent, final boolean viewFooter) {

        this.viewHeader = viewHeader;
        this.viewContent = viewContent;
        this.viewFooter = viewFooter;

        return "jstlSample.xhtml";
    }

    // アクセサメソッドは省略
}

initメソッドでヘッダ・コンテンツ・フッタの表示フラグを受け取ります。

ページ

続いてページ側です。

ページはリンクを表示するページと
リンクによって遷移するページを作ります。

まずはリンクを表示するページです。

<?xml version="1.0" encoding="Windows-31J" ?>
<!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:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"> 
    <f:view>
        <h:head>
            <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J" />
            <title>JSTL</title>
        </h:head>
        <h:body>
            <h:form id="sampleForm">
                <div>
                    <h:commandLink value="全部あり" action="#{jstlSample.init(true, true, true)}" />
                </div>
                <div>
                    <h:commandLink value="ヘッダのみ" action="#{jstlSample.init(true, false, false)}" />
                </div>
                <div>
                    <h:commandLink value="コンテンツのみ" action="#{jstlSample.init(false, true, false)}" />
                </div>
                <div>
                    <h:commandLink value="フッタのみ" action="#{jstlSample.init(false, false, true)}" />
                </div>
            </h:form>
        </h:body>
    </f:view>
</html> 

リンクによって渡すパラメータの値が変わっています。

つづいて遷移先のページです。

<?xml version="1.0" encoding="Windows-31J" ?>
<!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:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:h="http://java.sun.com/jsf/html"> 
    <f:view>
        <h:head>
            <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J" />
            <title>JSTL</title>
        </h:head>
        <h:body>
            <c:if test="#{jstlSample.viewHeader}">
                <div>
                    ヘッダ
                </div>
            </c:if>
            <c:if test="#{jstlSample.viewContent}">
                <div>
                    コンテンツ
                </div>
            </c:if>
            <c:if test="#{jstlSample.viewFooter}">
                <div>
                    フッター
                </div>
            </c:if>
        </h:body>
    </f:view>
</html> 

タグのtest属性ではManagedBeanの各フラグの値を参照しています。

【実行】

リンクを表示するページにアクセスします。

全部ありリンクをクリックすると・・・

ヘッダ・コンテンツ・フッタが表示されます。

フッタのみをクリックすると・・・

フッタのみが表示されます。

【最後に】

今回、タグをサンプルとして使ったのですが、
JSF2.0とJSTLの連携はそこまで使わないかなというのが個人的な感想です。

JSF2.0のカスタムタグは充実していると思うので、
JSTLのお世話になることはないのかなと。

たとえば、今回のサンプルのような表示/非表示であれば、
rendered属性を使用すれば良いので、タグは使わないでしょう。

ただ、ある範囲を非表示場合にはタグは使えるのかなと思います。