MayaaとJSF 2.0を比較する

Mayaaのブランクwarに書かれてるコードは以下の通り。これをJSF 2.0でも同じようになるように書いてみる。

テンプレート

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title>Welcome!</title>
    </head>
    <body>
        <p>
            <span id="message">Mayaa engine suspended.</span>
        </p>
        <p>
            <span id="version"></span>
        </p>
    </body>
</html>


mayaaファイル

<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org">

	<m:write id="message"
		value="Welcome to the Mayaa's template driven development!"/>

	<m:write id="version"
		value="Java Runtime: ${java.lang.System.getProperty('java.version')}"/>

</m:mayaa>

「m:write」プロセッサは「ui:insert」で置き換えればいいとして、問題は直接Javaのコードを実行している部分だ。

JDK6付属のRhino使うコンポーネントを作れば直接Javaのコードを実行できるのは容易に実装可能だ。ELもメソッドが実行できるようになったため、フレームワークがアプリケーションスコープにユーティリティコンポーネントを埋め込んでいくというのがはやると思う。ELファンクションは拡張が非常に面倒なためだ。

とりあえずここでは汎用でなんでもevalできるコードを書くのではなく、アプリケーションスコープにシステムプロパティにアクセスするユーティリティクラスを置くことによって実装してみる。


ではテンプレートから。xhtmlにしているだけ。

<?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:ui="http://java.sun.com/jsf/facelets">

    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
        <title>Welcome!</title>
    </head>
    <body>
        <p>
            <span jsfc="ui:insert" name="message">JSF engine suspended.</span>
        </p>
        <p>
            <span jsfc="ui:insert" name="version"></span>
        </p>
    </body>
</html>


続いてテンプレートクライアント。mayaaファイルに相当する。

<?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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html">
    <body>
        
        <ui:composition template="/index.xhtml">

            <ui:define name="message">
                Welcome to the JSF2's template driven development!
            </ui:define>


            <ui:define name="version">
                Java Runtime: ${UTIL.getProp("java.version")}
            </ui:define>
                        
        </ui:composition>
                
    </body>
</html>

Java EE 6の新機能のELメソッドつかって引数に渡している。ここをかえるといろんな情報が取得できる。

最後にアプリケーションスコープにおく管理Bean。JSFならスコープ管理は容易なためこれだけでよい。

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ApplicationScoped
@ManagedBean(name="UTIL")
public class Hoge {
    public String getProp(String key){
        return System.getProperty(key);
    }
}

これで実行結果が同じになる。拡張したければこのHogeクラスにメソッドを追加すればよい。ELファンクションのように実装のJavaコードとそのインターフェースの記述といった面倒な設定は存在しないのがわかると思う。

ちなみにエスケープしていないが、これは「c:out」などjstlを使えばよいだけ。ほかにも条件やループなど好きにカスタムタグを使ってよい。Ajaxで置き換える予定があるのなら「h:outputText」を使うとよいだろう。