JSF 2 (Glassfish 3.1.1 の mojarra) を使用して作成されたいくつかのテスト中に、説明できない奇妙な動作に直面しました。
これは私のマネージドBeanです:
@ManagedBean
@RequestScoped
public class TestBean {
private int id;
public void hideButton() {
id = 0;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
ここに私のxhtmlページがあります
<h:form> <h:inputHidden value="#{testBean.id}"/> <h:outputText value="#{testBean.id}"/> <h:commandButton value="set 1" actionListener="#{testBean.setId(1)}"> </h:commandButton> <h:commandButton value="hide button" action="#{testBean.hideButton}" rendered="#{testBean.id > 0}"> </h:commandButton> </h:form>
ページの初期ロード時に「ボタンを隠す」ボタンが表示されないことを期待していましたが、これは実際の事実です。ボタン「set 1」をクリックすると、ボタン「hide button」が表示されますが、これも当然のことです。本当に理解できないのは、「ボタンを隠す」ボタンを次にクリックしても、メソッドtestBean.hideButtonが呼び出されず、idが0に設定されないという事実です。BalusCからの非常に役立つ回答を読みました(本当にありがとう)ここ
commandButton/commandLink/ajax アクション/listener メソッドが呼び出されていないか、入力値が更新されていません
問題は「レンダリング」属性に関連していることを認識し、それを削除すると、アクションが呼び出されます。しかし、私の知る限り、クラス メンバーは UPDATE MODEL VALUES フェーズで初期化する必要があり、レンダリングされた属性に記載されている条件は INVOKE APPLICATION フェーズで true と評価され、アクションを呼び出す必要があります。
この例は、Bean のスコープを View/Session に変更すると機能します。ただし、「非表示ボタン」からrender属性を削除しても問題なく動作します
誰かがそのような行動を説明してくれますか?
つまり、レンダリングされた属性の式が評価されて、アクションを呼び出さない決定を下すのはどの段階でしょうか?