Когда проверка поля ввода зависит от некоторых пользовательских и сложных условий (очень необычно для вас), одним из решений будет определение пользовательского FacesValidator для поля ввода (при передаче дополнительных значений в качестве компонента f:attribute
) и реализуйте свои собственные правила проверки.
x html пример
<h:form id="form">
<p:messages id="messages"/>
<p:selectOneMenu id="console" value="#{javaMB.console}"
validator="customValidator">
<f:attribute name="pageTypeId" value="#{javaMB.pageTypeId}" />
<f:selectItem itemLabel="Select One" itemValue="" />
<c:if test="${javaMB.pageTypeId eq 1}">
<f:selectItem itemLabel="Xbox One" itemValue="Xbox One" />
</c:if>
<c:if test="${javaMB.pageTypeId eq 2}">
<f:selectItem itemLabel="PS4" itemValue="PS4" />
<f:selectItem itemLabel="Sega" itemValue="Sega" />
</c:if>
<c:if test="${javaMB.pageTypeId eq 3}">
<f:selectItem itemLabel="Wii" itemValue="Wii" />
</c:if>
</p:selectOneMenu>
<p:commandButton value="Submit" process="@form" update=":form:messages"/>
</h:form>
Валидатор пользовательских лиц
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
@FacesValidator(value = "customValidator")
public class CustomValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
//get input field value
String consoleName = (String) value;
//get some other value passed as component's attribute
int pageTypeId = (Integer) component.getAttributes().get("pageTypeId");
System.out.printf("Page type: %d, Console: %s\n", pageTypeId, consoleName);
//if input is required (not null) for page 2, check if input is null
if (pageTypeId == 2 && consoleName == null) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, "Input is required", ""));
}
//then implement any logic based on your requirements. For your unusual case,
if (pageTypeId == 2) {
if (!consoleName.equals("Sega")) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, "Sega is required for page type 2", ""));
}
}
}
}
Обратите внимание , что ваши требования очень необычны с инженерной точки зрения (как прокомментировали и другие), и что могут быть другие способы решить их в пользовательском интерфейсе.
С другой стороны, если честно, когда-то у меня было похожее требование: некоторые юристы настаивали на том, что все «выпадающие» опции всегда перечислены, и что пользователь явно информирован, если «неправильный / недопустимый» параметр выбран. Это было так странно для меня с инженерной точки зрения, но я думаю, это имело смысл с юридической точки зрения.