Когда я думал, что понял сразу... * вздох *
Рассмотрим следующую страницу 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
остается неизменным. (Это работает как ожидалось) -
При попытке сделать бар, не задавая значения для поля ввода, действие выполняется во время
applyRequestValuesPhase
из-за непосредственного атрибута. Изменяется переменнаяdidSomething
. (Это работает как ожидалось)
Что будет дальше, это описание гласит:
"Нулевое возвращаемое значение (как результат метода действия) заставляет обработку продолжать как обычно, то есть не-непосредственные компоненты проверяются, тогда выполняется модель обновления (если не было ошибок проверки). Для метода прослушивателя действий, который возвращает void, необходимо вызвать facesContext.renderResponse(), если нормальный поток не нужен."
У меня возникла идея, что обработка продолжается как обычно (поскольку мой метод действия не возвращает результат или силу renderResponse()
), что приводит к той же ошибке проверки. Единственное отличие заключается в том, что это происходит после установки didSomething
. Однако этого не происходит.. Похоже, что сайт по-прежнему пропускает все оставшиеся фазы, при этом поле ввода не затрагивается. Он повторно отображается без сообщения об ошибке.
Может кто-нибудь объяснить мне, где мое понимание того, как это работает, не так?