Na parte de validação, expecificamente no LivroBean, temos um método que corresponde a um validador, segue:
public void comecaComDigitoUm(FacesContext fc, UIComponent component,
Object value) throws ValidatorException {
String valor = value.toString();
if (!valor.startsWith("1")) {
throw new ValidatorException(new FacesMessage(
"ISBN deveria começar com 1"));
}
}
onde usamos esse validador diretamente no <h:inputText /> através do atributo validator. Porém, usando essa abordagem, caso ocorra a necessidade de usar esse validador em outras telas, será necessário replicar essa validação em outros beans, ou referenciar esse bean em outras telas, perdendo então o lado semântico.
o JSF disponibiliza uma forma de cadastrar nossos validadores sem a necessidade de um bean:
Através da inteface javax.faces.validator.Validator, podemos implementar o método validate; depois precisamos dar um identificador para nosso validador, para que possamos recupera-lo nas nas nossas páginas pela tag <f:validator />
segue o exemplo:
@FacesValidator("br.com.caelum.livraria.validator.ComecaComDigitoUmValidator")
public class ComecaComDigitoUmValidator implements Validator {
public void validate(FacesContext arg0, UIComponent arg1, Object value) throws ValidatorException {
String valor = value.toString();
if (!valor.startsWith("1")) {
throw new ValidatorException(new FacesMessage(
"ISBN deveria começar com 1"));
}
}
}
e no nosso xhtml:
<h:inputText id="isbn" value="#{livroBean.livro.isbn}">
<f:validator validatorId="br.com.caelum.livraria.validator.ComecaComDigitoUmValidator" />
</h:inputText>
O uso dos validadores em beans é mais indicado nos casos em que queremos um comportamento bem específico para aquela página em questão, vale avaliar se nosso validador pode ser usado em outra tela, se sim, é mais recomendado externaliza-lo em outra classe.
Valeu pessoal. Obrigado.