Подтвердить что ты не робот

Попытка понять немедленное = "истинное" пропускание входов, если оно не должно

Когда я думал, что понял сразу... * вздох *

Рассмотрим следующую страницу 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. Однако этого не происходит.. Похоже, что сайт по-прежнему пропускает все оставшиеся фазы, при этом поле ввода не затрагивается. Он повторно отображается без сообщения об ошибке.

Может кто-нибудь объяснить мне, где мое понимание того, как это работает, не так?

4b9b3361

Ответ 1

При immediate="true" на кнопке действие действительно вызывается во время фазы запроса запроса, и все остальные фазы пропускаются. Это также единственная точка этого атрибута: процесс (декодировать, проверять, обновлять и вызывать) компонент сразу во время применения фаз запроса.

Все входы, которые не имеют immediate="true", в любом случае игнорируются. Также обрабатываются только те входы, которые имеют immediate="true", но это происходит и во время фазы запроса запроса. Почему остальные фазы должны быть вызваны, если все уже произошло в фазах запроса заявки?

В статье Debug JSF lifecycle вы можете найти следующее резюме, которое должно просвещать, когда (не) использовать immediate"true":

Хорошо, когда следует использовать непосредственный атрибут?

Если это еще не совсем ясно, вот резюме, полное примеров использования в реальном мире, когда они могут быть полезными:

  • Если установлено только в UIInput (s), фаза проверки процесса будет выполнена вместо фазы запроса запроса. Используйте это, чтобы приоритезировать проверку для UIInput компонента (ов), о котором идет речь. Когда проверка или преобразование не выполняется для любого из них, неотмеченные компоненты не будут проверены/преобразованы.

  • Если установлено только в UICommand, фаза запроса запроса применения до тех пор, пока фазы значений модели обновления не будут пропущены для любого из компонентов (t24) UIInput. Используйте это, чтобы пропустить всю обработку формы. Например. Кнопка "Отмена" или "Назад".

  • Если установлено как в компонентах UIInput, так и UICommand, фаза запроса запроса применения до тех пор, пока фазы значений модели обновления не будут пропущены для любого из компонентов (t24) UIInput, который не имеет этого атрибута задавать. Используйте это, чтобы пропустить обработку всей формы для определенных полей (с немедленным). Например. "Забытая пароль" в форме входа в систему с требуемым, но не немедленным полем пароля.

См. также: