JSFのAjaxで外のh:formを再描画する
JSFのf:ajaxで、f:ajaxが囲まれているh:formを再描画するときは
<f:ajax render="@form"/>
のように書けます。
のように書けます。もちろん、h:formのidを書いても構わないけど、こっちの方が変更に強いです。
さてf:ajaxを囲んでいないh:formを再描画するときは?
このときは
<f:ajax render=":form1"/>
のように : 付きでh:formのidを書きます。
サンプル
Java側。
@Named("otherForm") @RequestScoped public class OtherFormPage { private String value; public String getValue() { return this.value; } public void renderOtherForm() { this.value = DateFormat.getTimeInstance(DateFormat.LONG).format(Calendar.getInstance().getTime()); } }
XHTML側。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" > <h:head> <meta charset="UTF-8"/> </h:head> <h:body> <h:form id="f1"> <h3>#{otherForm.value}</h3> </h:form> <h:form id="f2"> <h:commandButton value="外のformをサブミット" action="#{otherForm.renderOtherForm}"> <f:ajax render=":f1"/> </h:commandButton> </h:form> </h:body> </html>
成功。
あまりにもサンプルのためのサンプルすぎて恥ずかしいけど、動きました。
気になること
h:formの垣根を超えて再描画すること自体がOKなのかが気になります。どこかのサイトで「f:ajaxで再描画出来るのは自分が囲まれているh:formの中に限る」というような記述を読んだことがあるからです。
f:ajaxのドキュメントを読む限りではそんなことは書いていない気がするのですが、一方でJSFにはViewStateというものがあり、h:formが分かれているページは誤動作を引き起こすのではないか、とかねてから気になっているのです。
この辺りは実は会話スコープとf:ajaxを併用するときにも問題となります。なのでけっこう影響が大きく、マジメに調査しないといけません。。。
そう、調査しないといけないのですが・・・調査して「1つのページでh:formを分けるのはよろしくない」という結論が出てしまうとJSF2.0の魅力が一気に削がれるため、怖くて出来ないんですよね。。。
しかしこの懸念と、「動的にコンポーネントの型を変える方法が分からない」という2つの懸念は、JSFを実戦投入する上で最大の障壁となっています。私の中で。
避けては通れないトピックであり本格的に調査しようと思います。