JavaEE 7 JSF 2.2の超簡単カスタムコンポーネント

2.2ではカスタムコンポーネントをすぐに作成、実装することができる。
XMLとかなにもいらない。
やっと来たかーって感じ。


カスタムコンポーネントのコード。

package jsf;

import java.io.IOException;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;


@FacesComponent(value = "custom.aoi_blink" ,tagName = "aoi_blink" , createTag = true)
public class Blink extends UIComponentBase{

    @Override
    public String getFamily() {
        return "com.example.blink";
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {
        ResponseWriter rw = context.getResponseWriter();
        rw.write("<span style='color:blue;text-decoration:blink;'>");
    }

    @Override
    public void encodeEnd(FacesContext context) throws IOException {
        ResponseWriter rw = context.getResponseWriter();
        rw.write("</span>");
    }
}

テンプレート。

<?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:jsf="http://xmlns.jcp.org/jsf"
      xmlns:hoge="http://xmlns.jcp.org/jsf/component">
    <head jsf:id="head">
        <title>JSF 2.2ですね</title>
    </head>
    <body jsf:id="body">
        <hoge:aoi_blink>青いブリンク</hoge:aoi_blink>
    </body>
</html>


実行結果は以下の通り。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head">
    <title>JSF 2.2ですね</title>
</head>
<body id="body">
    <span style='color:blue;text-decoration:blink;'>青いブリンク</span>
</body>
</html>


ポイントは@FacesComponentアノテーション

2.0では名前となるvalueしかなかったが、2.2ではいろいろと増えている。
tagName要素はなければクラス名の先頭を小文字にしたものが有効となる。
createTag要素がポイント。これをtrueにするだけでタグの設定がいらなくなる。省略はfalseで従来通り。
namespace要素はxmlnsで指定できるもの。デフォルトは「http://xmlns.jcp.org/jsf/component」。


というわけで、カスタムコンポーネントを利用するのに必要なものはなくなった。

  1. カスタムコンポーネントを作る
  2. カスタムコンポーネントを使う

この2つの手順だけである。




Firefox以外では実行結果がおもしろくないので注意です。

ちなみにNetBeansではカスタムコンポーネントのクラスを作るとカスタムコンポーネントの補完もきくようになるので楽々開発できる。