Попытка понять немедленное = "истинное" пропускание входов, если оно не должно
Когда я думал, что понял сразу... * вздох *
Рассмотрим следующую страницу 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
. Однако этого не происходит.. Похоже, что сайт по-прежнему пропускает все оставшиеся фазы, при этом поле ввода не затрагивается. Он повторно отображается без сообщения об ошибке.
Может кто-нибудь объяснить мне, где мое понимание того, как это работает, не так?
Ответы
Ответ 1
При immediate="true"
на кнопке действие действительно вызывается во время фазы запроса запроса, и все остальные фазы пропускаются. Это также единственная точка этого атрибута: процесс (декодировать, проверять, обновлять и вызывать) компонент сразу во время применения фаз запроса.
Все входы, которые не имеют immediate="true"
, в любом случае игнорируются. Также обрабатываются только те входы, которые имеют immediate="true"
, но это происходит и во время фазы запроса запроса. Почему остальные фазы должны быть вызваны, если все уже произошло в фазах запроса заявки?
В статье Debug JSF lifecycle вы можете найти следующее резюме, которое должно просвещать, когда (не) использовать immediate"true"
:
Хорошо, когда следует использовать непосредственный атрибут?
Если это еще не совсем ясно, вот резюме, полное примеров использования в реальном мире, когда они могут быть полезными:
-
Если установлено только в UIInput
(s), фаза проверки процесса будет выполнена вместо фазы запроса запроса. Используйте это, чтобы приоритезировать проверку для UIInput
компонента (ов), о котором идет речь. Когда проверка или преобразование не выполняется для любого из них, неотмеченные компоненты не будут проверены/преобразованы.
-
Если установлено только в UICommand
, фаза запроса запроса применения до тех пор, пока фазы значений модели обновления не будут пропущены для любого из компонентов (t24) UIInput
. Используйте это, чтобы пропустить всю обработку формы. Например. Кнопка "Отмена" или "Назад".
-
Если установлено как в компонентах UIInput
, так и UICommand
, фаза запроса запроса применения до тех пор, пока фазы значений модели обновления не будут пропущены для любого из компонентов (t24) UIInput
, который не имеет этого атрибута задавать. Используйте это, чтобы пропустить обработку всей формы для определенных полей (с немедленным). Например. "Забытая пароль" в форме входа в систему с требуемым, но не немедленным полем пароля.
См. также: