В простейшем случае вы можете установить атрибут immediate
компонента UICommand
на true
. Затем он пропустит обработку UIInput
компонентов, которые не имеют этот атрибут true
.
comp.setImmediate(true);
Подробное описание использования этого атрибута см. Во второй половине этого ответа .
Если это не вариант, то лучше всего поместить кнопку отмены в отдельную форму, чтобы она фактически заканчивалась следующим образом:
<h:form>
input fields
submit button
</h:form>
<h:form>
cancel button
</h:form>
Если это также невозможно из-за ограничений дизайна / макета (читай: это невозможно исправить только с помощью CSS / JS), то вам нужно в каждом валидаторе проверять, какая кнопка была нажата. Вы можете проверить это по наличию имени клиента (ID) кнопки в карте параметров запроса. Например, в качестве атрибута компонента:
required="#{not empty param['formId:submitButtonId']}"
или
required="#{empty param['formId:cancelButtonId']}"
или в начале метода валидатора validate()
:
if (externalContext.getRequestParameterMap().get("formId:submitButtonId") == null) {
return; // Skip validation when normal submit button is not pressed.
}
или
if (externalContext.getRequestParameterMap().get("formId:cancelButtonId") != null) {
return; // Skip validation when cancel button is pressed.
}