2014-08-31 3 views
4

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

У меня есть selectBooleanCheckbox, и когда его true, я хочу использовать FirstValidator еще, я хочу использовать SecondValidator. Я ничего не нашел об этом «специальном» случае.

Ничего особенного только для примера кода:

Xhtml:

<?xml version="1.0" encoding="UTF-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:h="http://java.sun.com/jsf/html"> 
<h:head> 

</h:head> 

<h:body> 
<h:form> 
    <h:selectBooleanCheckbox value="#{testBean.firstValidator}"/> 
    <h:inputText> 
     <f:validator validatorId="FirstValidator" /> 
    </h:inputText> 
    <h:commandButton value="Test" /> 
    <h:messages /> 
</h:form> 

</h:body> 
</html> 

Bean:

@ManagedBean 
@ViewScoped 
public class TestBean implements Serializable{ 
private boolean firstValidator; 

public boolean isfirstValidator() { 
    return firstValidator; 
} 

public void setfirstValidator(boolean firstValidator) { 
    this.firstValidator = firstValidator; 
} 
} 

Validator1:

@FacesValidator("FirstValidator") 
public class FirstValidator implements Validator{ 

@Override 
public void validate(FacesContext context, UIComponent component, 
     Object value) throws ValidatorException { 
    String valueAsString = (String) value; 
    if(valueAsString.contains("a")){ 
     throw new ValidatorException(new FacesMessage("Fail!")); 
    } 
} 
} 

Validator2:

@FacesValidator("SecondValidator") 
public class SecondValidator implements Validator{ 

@Override 
public void validate(FacesContext context, UIComponent component, 
     Object value) throws ValidatorException { 
    String valueAsString = (String) value; 
    if(valueAsString.contains("b")){ 
     throw new ValidatorException(new FacesMessage("Fail2!")); 
    } 
} 
} 

ответ

4

Просто установите/отключите валидатор в зависимости от значения флажка. Вам нужно только убедиться, что вы выбрали проверенное значение как доступное во время времени сборки (которое выполняется во время фазы восстановления). Таким образом, вы определенно не можете использовать значение модели #{testBean.firstValidator} для этого (которое устанавливается только в фазе значений модели обновления). Вам нужно будет определить параметр HTTP-запроса. Он пуст, если флажок снят, иначе он не будет пустым.

Сначала свяжите флажок компонента к представлению с помощью binding атрибута (не в бобе!):

<h:selectBooleanCheckbox binding="#{checkbox}" ... /> 

Таким образом, параметр запроса может быть динамически получены #{param[checkbox.clientId]}.

Теперь вы можете использовать либо условную установку валидатора ID:

<f:validator validatorId="#{empty param[checkbox.clientId] ? 'firstValidator' : 'secondValidator'}" /> 

Или условной установки disabled атрибут валидатора:

<f:validator validatorId="firstValidator" disabled="#{not empty param[checkbox.clientId]}" /> 
<f:validator validatorId="secondValidator" disabled="#{empty param[checkbox.clientId]}" /> 

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

Validator FirstValidator = new FirstValidator(); 
+0

спасибо! Хороший и полезный балусный ответ, снова :)) – pL4Gu33

+0

Добро пожаловать. – BalusC

Смежные вопросы