Как мгновенно проверять значения, но проверить, требуется ли только для полной отправки?

В настоящее время я добавляю подтверждение в форму. Есть две вещи, которые нужно проверить: правильность самого значения (например, если это положительное целое или действительное письмо) и были ли заполнены все обязательные поля.

Однако, если каким-то образом (f:ajax или атрибут IceFaces partialSubmit) я делаю проверку правильности типа сразу (например, когда поле теряет фокус), он также проверяет атрибут required в этом такой же шаг. В большинстве случаев это не проблема, так как пользователь уже ввел значение и, скорее всего, исправит его, а не вернется в пустое поле.

Однако в случае, когда он действительно хочет очистить поле снова, он больше не может этого сделать, не получив ошибку. Вследствие этого я хочу только проверить требуемые поля при окончательной отправке страницы.

В настоящее время моя единственная идея отделить два типа проверки - это выполнить все необходимые проверки в методе действия beans, привязывая его непосредственно к окончательной отправке через кнопку.

Есть ли другой способ?

(Для фона: причина, по которой можно снова очистить поле, состоит в том, что требования могут меняться в зависимости от других вариантов в форме. Поэтому можно было бы вообще не указывать это поле и только после этого исправить вариант, который фактически делает это поле необязательным.)

Ответ 1

Просто пусть атрибут required оценит true, когда кнопка отправки действительно нажата.

Ответ, однако, зависит от того, как ваша кнопка отправки выполняет свою логику (стандартная, f:ajax, ICEfaces и т.д.). Но в основном это сводится к тому, что вы можете проверить карту параметров запроса для параметра запроса, который указывает, что нажата кнопка отправки.

Например, если это стандартная командная кнопка:

<h:form id="form">
    ...
    <h:commandButton id="submit" value="Submit" action="#{bean.submit}" />
</h:form>

Затем вы можете проверить его, проверив, присутствует ли идентификатор клиента кнопки в карте параметров запроса:

<c:set var="submitButtonPressed" value="#{not empty param['form:submit']}" />
...
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />

Или, если это кнопка <f:ajax>:

<h:form id="form">
    ...
    <h:commandButton id="submit" value="Submit" action="#{bean.submit}">
        <f:ajax execute="@form" ... />
    </h:commandButton>
</h:form>

Затем вы можете проверить это, установив, что параметр javax.faces.source равен идентификатору клиента кнопки:

<c:set var="submitButtonPressed" value="#{param['javax.faces.source'] == 'form:submit'}" />
...
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />

Вы даже можете комбинировать оба:

<c:set var="submitButtonPressed" value="#{not empty param['form:submit'] or param['javax.faces.source'] == 'form:submit'}" />
...
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />
<h:inputText ... required="#{submitButtonPressed}" />