Java EE7が出てJSF2.2になりましたが、ビッグチケットに隠れて気づかなかったのですがresetValue属性なるものが追加されていました(^^;
JSFで結構うっとおしいなぁと思う1つにバリデーションでエラーとなった後の挙動があると思うのですが、その際に有益な手段となりそうです。
挙動結果
プログラムは単純で、実行すると以下のような画面が初期表示されます。
リンクを押下するたびにテキストの値がインクリメントされます。
2つ目のテキストにはバリデーションがあって、10以下の値だとエラーになります。
保存ボタンを押してみると
バリデーションメッセージが表示されてエラーになります。
さて、ここで再度リンクを押下してみます。すると、バリデーションエラーになっているため、インクリメントできません。
あとでビュー定義を載せますが基本的に全てAjaxによる部分更新です。
で、これをJSF2.1で普通に作ると、リンクのimmediateをtrueにしてみて、でも画面更新されなくて…あれっ、あれっ、じゃあPrimeFaces使うか、みたいになったり…。
で、JSF2.2のresetValuesを使うと、ある1つの記述するだけで、以下のようにリンク押下でインクリメント処理が実行されます。
地味に便利(^^)
ビューの定義
resetValuesを入れる前のビューは以下です。
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>ResetValuesの挙動確認</title>
</h:head>
<h:body>
<h:form id="form">
<h:messages id="msgs" />
<h:inputText id="v1" value="#{bean.value1}" />
<h:commandLink value="1を足す" action="#{bean.incValue1()}">
<f:ajax render="v1" />
</h:commandLink>
<h:inputText id="v2" value="#{bean.value2}">
<f:validateLongRange minimum="10" />
</h:inputText>
<h:commandButton value="保存">
<f:ajax execute="v1 v2" render="msgs v1 v2" />
</h:commandButton>
</h:form>
</h:body>
</html>
ちなみにBeanは以下のように単純です。
package jp.co.hoge.javaee7;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class Bean {
private int value1;
private int value2;
public void incValue1(){
value1++;
}
}
resetValues属性を入れる
で、インクリメント可能にするには、リンクの部分を
<h:commandLink value="1を足す" action="#{bean.incValue1()}">
<f:ajax render="v1" />
</h:commandLink>
以下のように変更します。属性をtrueに指定するだけですね。
<h:commandLink value="1を足す" action="#{bean.incValue1()}">
<f:ajax render="v1" resetValues="true"/>
</h:commandLink>
これだけ!
自分の所の開発は現在Java EE6でJSF2.1ですが、今すぐ欲しい…orz
ちなみに参考元のブログの最後に、ajaxではない場合にf:resetValuesがある、と書いてましたがNetBeans7.4RC1ではタグ自体がみえなかったので試してません(^^;
はやくJava EE7でJSF2.2使って開発したいなぁ。。。