Динамическая требуемая проверка для разных кнопок?

В настоящее время я изучаю jsf 2.0 из основной книги jsf 2.0 + Glassfish + cdi.

У меня есть вопрос о функции проверки JSF.

Допустим, у меня есть очень простое приложение для входа в систему, которое имеет очень простой макет, например:

userid : (поле ввода для userid - с использованием required="true")
password : (ввод секрета для пароля - с использованием required="true")
loginButton + registerButton (с использованием немедленного = "true") + checkUserIdAvailabilityButton

Теперь предположим, что нажата кнопка входа в систему, а идентификатор пользователя и пароль оставлены пустыми, в обоих полях возникнет ошибка проверки, и это работает так, как я предполагал.

И когда нажата кнопка registerButton, ему все равно, заполнены ли пользователем идентификатор пользователя или пароль, поскольку он использует немедленное = "true", таким образом обходя проверку, и команда выполняется на этапе применения значения запроса, и это все еще работает как что я намеревался.

И вот моя проблема. Когда нажата кнопка checkUserIdAvailabilityButton, я только ожидаю, что идентификатор пользователя будет заполнен, и мне не нужно заботиться о том, заполнено ли поле пароля или нет, но поле пароля выдаст ошибку, говорящую, что это обязательно поле.

Можно ли как-то решить такую ​​проблему? Я знаю, что это может быть очень простое приложение, но на моем рабочем месте, я думаю, они создают множество подобных экранов, например, кнопку сохранения вместе с кнопкой обновления с различными обязательными полями, но кнопки находятся на одной странице.

Спасибо !


person Albert Gan    schedule 16.11.2010    source источник


Ответы (1)


Установите и кнопку доступности, и поле имени пользователя с помощью immediate="true" и поместите кнопку регистрации в отдельный <h:form>.

E.g.

<h:form>
     <h:inputText value="#{bean.username}" required="true" immediate="true" />
     <h:inputSecret value="#{bean.password}" required="true" />
     <h:commandButton value="Login" action="#{bean.login}" />
     <h:commandButton value="Check name availability" action="#{bean.checkNameAvailability}" immediate="true" />
</h:form>
<h:form>
     <h:commandButton value="Register" action="#{bean.register}" />
</h:form>

Альтернативой является определение в обязательном атрибуте, какая кнопка была нажата (тогда она присутствует как параметр запроса).

<h:form id="form">
     <h:inputText value="#{bean.username}" required="#{not empty param['form:login'] or not empty param['form:check']}" />
     <h:inputSecret value="#{bean.password}" required="#{not empty param['form:login']}" />
     <h:commandButton id="login" value="Login" action="#{bean.login}" />
     <h:commandButton id="check" value="Check name availability" action="#{bean.checkNameAvailability}" />
     <h:commandButton value="Register" action="#{bean.register}" />
</h:form>
person BalusC    schedule 16.11.2010
comment
Здравствуйте, спасибо за ответ. Я понимаю второе решение. Но не могли бы вы объяснить первое решение? о немедленном = истинном в поле bean.username, потому что до сих пор я понимаю только эффект немедленного = истинного на командных кнопках, который заключается в обходе проверки, и команда выполняется на этапе применения значения запроса - person Albert Gan; 18.11.2010
comment
Отправка с помощью кнопки с immediate="true" будет обрабатывать только те поля, которые также имеют immediate="true". Атрибут immediate более подробно объясняется на практических примерах в этой статье. Примечание: код статьи ориентирован на JSF 1.2, но будет работать и на 2.0, а теория применима и к JSF 2.0. - person BalusC; 18.11.2010