<< CDIのsession scopeビーン | Home | JSF2で、バリデーションエラーが起きると、inputHiddenの値が失なわれる。 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

JSF2で、renderedを指定していると、イベントが配信されない。

JSF2でページ制御のコンポジットコンポーネントを作ってみたら、やっかいな現象に見舞われた。

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@RequestScoped
@Named
public class Bug1 {
int value;

public int getValue() {return value;}
public void setValue(int value) {this.value = value;}

public void decrease() {--value;}
public void increase() {++value;}
}
<!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"
xmlns:f="http://java.sun.com/jsf/core">
<h:form>
<h:inputHidden value="#{bug1.value}"/>
<h:commandButton value="-" action="#{bug1.decrease}" rendered="#{bug1.value gt 0}"/>
<h:outputText value="#{bug1.value}"/>
<h:commandButton value="+" action="#{bug1.increase}"/>
</h:form>
</html>

これ、実行すると、整数の両側に、'-'、'+'ボタンが表示され、'-'は、値が1以上の時にだけ表示されるんだけど、'-'ボタンが全く機能しない。

どうやら、以下のようなことが起きているっぽい。

  • '-'ボタンクリック。
  • JSFがBug1インスタンスを生成。
  • JSFがイベントを配信しようとするが、その時rendered属性をチェック。でも、Bug1はnewされたばかりなのでvalueフィールドは0なので、rendered=false。このためイベントの配信を中止。
  • リクエストの値を、Bug1インスタンスに反映。ここでようやくvalueフィールドが設定されるのだけど、時、既に遅し。

inputHiddenのところに、immediate='true'したら大丈夫かと思ったけど、なぜか効果無し(なんで?)。

仕様なのかもしれないけど、これって困るよなぁ。とりあえずバグ報告してみた。xhtmlのところ思いっきり文字化けしてしまった。なんで、ここのBTSには、preview機能が無いんだろう...




コメント追加 トラックバック送信
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8