JSFを利用していて、海外のStackOverflowをよく見る方はご存じだと思うのですが、回答の常連となっているBalusCさんというJSFマスターがいます。
で、この方が作られたOmniFacesというJSFのサポートライブラリがあるのですが、今回の開発で使ってみることにしました。
omnifaces.org
サイトの副題になっている「To make JSF life easier」って表現いいですね。JSFライフは辛いときもあるので…。
具体的にどんな機能が揃っているのか?は以下のshowcaseで確認できます。
OmniFaces Showcase
なお、OmniFacesの概要や誕生経緯とかについては以下翻訳でわかりやすくまとまっています。
www.infoq.com
ここにも書いてありますが、PrimeFacesやRichFaces等のJSFリッチコンポ―ネントライブラリとバッティングするようなものではなく、併用して使える支援ライブラリです。ライセンスはApache License 2.0。
OmniFaces自体はあまり大きいプロジェクトではなく、わりと個人寄りなライブラリなので、採用判断は選ぶ方におまかせ…です(^^;
で、どんなことができる?というところで、わかりやすい所を挙げてみます。
JSF使っているとFacesContextを使う機会が多いと思いますが、普通に書くと長いですよね(^^;
if(FacesContext.getCurrentInstance() != null){
String hoge = FacesContext.getCurrentInstance().getExternalContext().getInitParameter("hoge");
ProjectStage ps = FacesContext.getCurrentInstance().getApplication().getProjectStage();
boolean beanChecked = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(FacesContext.getCurrentInstance(), "#{hogeBean.checked}", boolean.class);
}
自分でFacesContext用にWrapper/Helperクラスみたいなの作ってる人も多いかと思います。
上記と同じ処理がOmniFaces使うと以下のように書けます。
if(Faces.hasContext()){
String hoge = Faces.getInitParameter("hoge");
ProjectStage ps = Faces.getApplication().getProjectStage();
boolean beanChecked = Faces.evaluateExpressionGet("#{hogeBean.checked}");
}
OmniFacesのFaces.javaのコードをみると
omnifaces/Faces.java at 2.0 · omnifaces/omnifaces · GitHub
各々ショートカット的に呼べるようにラップしてるだけなんですが。
あと内部的にFacesLocalというのを持っていて、毎回毎回getCurrentInstance()を呼ぶコストを下げているようです。
FacesLocal (OmniFaces 2.0-SNAPSHOT API)
Maven使っていれば以下定義をpom.xmlに追加するだけで使えます。
<dependency>
<groupId>org.omnifaces</groupId>
<artifactId>omnifaces</artifactId>
<version>2.0</version>
</dependency>