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」を使うとよいだろう。