Próbując zrozumieć natychmiastowe = „prawdziwe” pomijanie wejść, gdy nie powinno

Właśnie wtedy, gdy myślałem, że zrozumiałem natychmiast ... * westchnienie *

Rozważ następującą stronę 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}" />

I to fasola bazowa:

public class TestBean {
   private String didSomething = "Nothing done yet";
   // + getter

public void doFoo() {
    didSomething = "Did foo!";        
}

public void doBar() {
    didSomething = "Did bar!";        
}

Od wszystkiego, co czytałem o natychmiastowym, spodziewam się, że:

Podczas próby wykonania foo bez podania wartości dla pola wejściowego, akcja nigdy nie jest wykonywana, ponieważ podczasprocessValidationsPhase wystąpił błąd, powodujący ponowne wyświetlenie strony bezpośrednio po tej fazie z komunikatem o błędzie. WartośćdidSomething pozostaje bez zmian. (Działa to zgodnie z oczekiwaniami)

Gdy próbujesz zrobić pasek, nie podając wartości dla pola wejściowego, akcja jest wykonywana podczasapplyRequestValuesPhase ze względu na atrybut bezpośredni. ZmiennadidSomething jest zmieniony. (Działa to zgodnie z oczekiwaniami)

O tym, co dzieje się dalej,ten opis stwierdza:

„Zwracana wartość zerowa (jako wynik metody działania) powoduje, że przetwarzanie jest kontynuowane jako normalne, tzn. Komponenty inne niż bezpośrednie są sprawdzane, a następnie wykonywany jest model aktualizacji (jeśli nie wystąpiły błędy sprawdzania poprawności). konieczne jest wywołanie facesContext.renderResponse (), jeśli normalny przepływ nie jest pożądany. "

Z tego wywnioskowałem, że przetwarzanie jest kontynuowane normalnie (ponieważ moja metoda działania nie zwraca ani wyniku, ani siły)renderResponse()), powodując ten sam błąd weryfikacji. Jedyną różnicą byłoby to, że tak się dziejepo oprawadidSomething. Jednak tak się nie dzieje. Zamiast tego wydaje się, że strona nadal pomija wszystkie pozostałe fazy, a pole wprowadzania nie jest dotykane. Ponownie renderuje bez komunikatu o błędzie.

Czy ktoś może mi wyjaśnić, gdzie jest moje zrozumienie tego, jak to działa?

questionAnswers(1)

yourAnswerToTheQuestion