Ответ 1
Вам нужно проверить атрибут required
, если другие входы отправили непустое значение. Так как это может привести к довольно некоторому шаблону, вот пример запуска с тремя входными компонентами.
<h:form id="form">
<h:inputText id="input1" value="#{bean.input1}" required="#{empty param['form:input2'] and empty param['form:input3']}" />
<h:inputText id="input2" value="#{bean.input2}" required="#{empty param['form:input1'] and empty param['form:input3']}" />
<h:inputText id="input3" value="#{bean.input3}" required="#{empty param['form:input1'] and empty param['form:input2']}" />
</h:form>
Альтернативой является привязка компонентов к виду и использование UIInput#getValue()
для проверки значения предыдущих компонентов и UIInput#getSubmittedValue()
, чтобы проверить их для следующих компонентов (компоненты обрабатываются в порядке, как они появляются в дереве компонентов). Таким образом, вам не нужно жестко кодировать идентификаторы клиентов. Вам нужно только убедиться, что имена привязок не конфликтуют с существующими именами управляемого bean.
<h:inputText binding="#{input1}" value="#{bean.input1}" required="#{empty input2.submittedValue and empty input3.submittedValue}" />
<h:inputText binding="#{input2}" value="#{bean.input2}" required="#{empty input1.value and empty input3.submittedValue}" />
<h:inputText binding="#{input3}" value="#{bean.input3}" required="#{empty input1.value and empty input2.value}" />
Вы поймете, что это вызывает уродливый шаблон, когда у вас есть все больше и больше компонентов. Утилита JSF OmniFaces имеет <o:validateAllOrNone>
валидатор для конкретной цели. Смотрите также живую демонстрацию. Основываясь на тэгах quesiton, вы используете OmniFaces, поэтому вы уже должны быть установлены только с этим:
<o:validateAllOrNone components="input1 input2 input3" />
<h:inputText id="input1" value="#{bean.input1}" />
<h:inputText id="input2" value="#{bean.input2}" />
<h:inputText id="input3" value="#{bean.input3}" />