すぐにわかったと思ったら…(はぁ)
次の JSF ページを検討してください。
<h:inputText value="#{testBean.text}" required="true" />
<h:commandButton actionListener="#{testBean.doFoo}" value="Do Foo" />
<h:commandButton immediate="true" actionListener="#{testBean.doBar}" value="Do Bar" /><br />
<h:outputText value="#{testBean.didSomething}" />
そして、このバッキング Bean:
public class TestBean {
private String didSomething = "Nothing done yet";
// + getter
public void doFoo() {
didSomething = "Did foo!";
}
public void doBar() {
didSomething = "Did bar!";
}
即時について読んだすべてから、次のことが期待されます。
入力フィールドに値を指定せずに foo を実行しようとすると
processValidationsPhase
、エラーが発生したときにアクションが実行されず、このフェーズの直後にページが再レンダリングされ、エラー メッセージが表示されます。の値はdidSomething
変更されません。(これは期待どおりに動作します)入力フィールドに値を指定せずに bar を実行しようとすると
applyRequestValuesPhase
、immediate 属性のためにアクションが実行されます。変数didSomething
が変更されます。(これは期待どおりに動作します)
次に何が起こるかについて、この説明は次のように述べています。
"null の戻り値 (アクション メソッドの結果として) により、処理は通常どおり続行されます。つまり、非即時コンポーネントが検証され、その後 update-model が実行されます (検証エラーが発生しなかった場合)。void を返すアクション リスナー メソッドの場合、通常のフローが望ましくない場合は、facesContext.renderResponse(); を呼び出す必要があります。"
このことから、処理は通常どおり続行され (アクション メソッドは結果も強制も返さないためrenderResponse()
)、同じ検証エラーが発生するという考えがありました。唯一の違いは、設定後didSomething
に発生することです。ただし、これは起こりません。代わりに、入力フィールドに触れずに、サイトがまだ残りのすべてのフェーズをスキップしているように感じます. エラーメッセージなしで再レンダリングされます。
これがどのように機能するかについての私の理解が間違っている場所を誰かが説明してもらえますか?