• Nenhum resultado encontrado

Conheça os validadores nativos

No documento Casa do Código. Agradecimentos (páginas 183-188)

Seguindo o ciclo de vida do JSF, logo após a conversão, vem a validação. Por isso, agora vamos ver quais as formas de validação o JSF traz prontas para usarmos. Como exemplo, vamos considerar um trecho de tela como o seguinte:

<h:panelGrid columns="2"> Ano de Fabricação:

<h:inputText value="#{auto.anoFabricacao}">

<f:validateLongRange minimum="1950" maximum="2012"/> </h:inputText>

Ano do Modelo:

<h:inputText value="#{auto.anoModelo}">

<f:validateLongRange minimum="1950" maximum="2013"/> </h:inputText>

Preço: <h:inputText value="#{auto.preco}" />

Kilometragem: <h:inputText value="#{auto.kilometragem}" />

7.37. Conheça os validadores nativos Casa do Código Observações: <h:inputTextarea value="#{auto.observacoes}" /> </h:panelGrid>

Tanto a propriedademinimumquanto amaximumaceitam Expression Language, caso necessário. Apesar de estarmos colocando esses validadores no XHTML, como já aprendemos sobre o ciclo de vida, sabemos que isso vai virar uma informação para o JSF validar nossos dados do lado servidor.

Temos várias opções de validadores disponíveis, e todos eles têm algumas pro- priedades em comum:

• disabled: que aceita uma expressão e podemos usar para desligar condici- onalmente um validador. Por exemplo, podemos ter uma regra de negócio que nos faça deixar ligado um validador apenas se o status do objeto sendo salvo for diferente de “rascunho"; ou ainda deixar que o usuário administra- dor possa enviar dados sem nenhuma restrição.

<h:inputText value="#{auto.anoFabricacao}"> <f:validateLongRange

minimum="1950" maximum="2012"

disabled="#{currentUser.role == 'admin'}"/> </h:inputText>

• for: essa propriedade é usada quando trabalhamos com composite compo- nents. Veremos como criar esses componentes e então usaremos essa propri- edade na seção9.6.

• binding: assim como qualquer outro componente JSF, podemos usar a pro- priedade bindingpara ligar o objeto da árvore do JSF com uma propriedade do Managed Bean e assim temos como manipulá-lo de forma programática. f:validateLongRange e f:validateDoubleRange

São usados para validar números inteiros e reais. Podemos notar que não temos validadores para Integere Float, já que esses são apenas versões com menor capacidade de armazenamento que Longe Double.

Propriedades:

• minimum: aceita Expression Language, e indica o mínimo valor que o número em questão pode ter.

Casa do Código Capítulo 7. Entenda o JSF e crie aplicações web • maximum: aceita Expression Language, e indica o máximo valor que o nú-

mero em questão pode ter. f:validateLength

É bem parecido com os validadores f:validateLongRange e f:validateDoubleRange, a diferença é que enquanto estes trabalham com valores numéricos e seus intervalos, o f:validateLength trabalha com com- primento máximo e mínimo de uma String. Podemos, por exemplo, usá-lo para validar o comprimento mínimo de uma senha.

Propriedades:

• minimum: aceita Expression Language, e indica o comprimento mínimo que a Stringem questão pode ter.

• maximum: aceita Expression Language, e indica o comprimento máximo que a Stringem questão pode ter.

f:validateRequired

Valida a obrigatoriedade ou não do preenchimento do valor de um compo- nente de entrada de dados. Na prática, gera o mesmo resultado que a propriedade requireddo componente.

<h:inputText value="#{auto.preco}">

<f:validateRequired disabled="#{currentUser.role == 'admin'}"/> </h:inputText>

Ou com o mesmo resultado:

<h:inputText value="#{auto.preco}"

required="#{currentUser.role != 'admin'}"/> f:validateRegex

Esse nos permite criar uma validação baseada em expressão regular. Apesar de termos validadores prontos em projetos como o Caelum Stella, disponível emhttp:// stella.caelum.com.br/, podemos utilizar expressões para validar CEP, e-mail, e outros formatos. É importante salientar que esse validador não gera nenhuma máscara para o campo. Ele apenas valida um determinado padrão do lado servidor.

Esse validador possui apenas uma propriedade:

7.37. Conheça os validadores nativos Casa do Código • pattern: podemos colocar qualquer expressão que desejarmos. Por exemplo,

uma expressão para validar um login que possua entre 6 e 18 caracteres, acei- tando somente letras minúsculas.

<h:inputText value="#{user.login}">

<f:validateRegex pattern="[a-z]{6,18}"/> </h:inputText>

Nesse caso, fizemos uma expressão regular que indica que a senha só pode ter letras de aaté ze deve estar entre 6 e 18 caracteres.

f:validateBean

Na seção8.4veremos mais detalhes da integração entre JSF e Bean Validation. Mas em resumo, essa tag é usada para especificar os grupos que desejamos validar. Isso porque, apesar de a nossa classe conter as anotações da Bean Validation, em uma tela como um wizard por exemplo, vamos querer validar apenas parte das proprie- dades em cada momento.

Propriedade:

• validationGroups: informamos o grupo de propriedades que desejamos va- lidar. Caso queiramos informar mais de um grupo, informamos todos eles separados por vírgula.

Podemos desabilitar a validação via bean validation em determinadas proprie- dades como a seguir.

<h:panelGrid columns="2"> Ano de Fabricação:

<h:inputText value="#{auto.anoFabricacao}"> <f:validateBean disabled="true"/> </h:inputText>

Ano do Modelo:

<h:inputText value="#{auto.anoModelo}">

<f:validateBean disabled="${auto.status == 'rascunho'}"/> </h:inputText>

Preço:

Casa do Código Capítulo 7. Entenda o JSF e crie aplicações web

Kilometragem:

<h:inputText value="#{auto.kilometragem}" /> Observações:

<h:inputTextarea value="#{auto.observacoes}" /> </h:panelGrid>

Mas geralmente faríamos isso em situações como a mencionada acima, na qual temos um wizard ou alguma tela de cadastro não tão trivial em que aqueles valores, apesar de obrigatórios, não precisam ser validados naquele momento, provavelmente porque serão providos depois. Nesses casos, uma possibilidade é trabalharmos com grupos e usar algo parecido com o seguinte:

<f:validateBean validationGroups="cadastroBasico"> <h:panelGrid columns="2">

Ano de Fabricação:

<h:inputText value="#{auto.anoFabricacao}"/> Ano do Modelo:

<h:inputText value="#{auto.anoModelo}"/> Preço:

<h:inputText value="#{auto.preco}" /> Kilometragem:

<h:inputText value="#{auto.kilometragem}" /> Observações:

<h:inputTextarea value="#{auto.observacoes}" /> </h:panelGrid>

</f:validateBean>

Agora sim, considerando que essa tela corresponde a um cadastro básico, cam- pos que são obrigatórios mas que não são parte desse grupo não seriam validados agora.

Outro ponto interessante nos exemplos apresentados é que podemos tanto colo- car a tag dentro de um determinado componente, como em volta de todos os compo- nentes que gostaríamos que tivessem o mesmo tratamento. Muito menos repetitivo.

No documento Casa do Código. Agradecimentos (páginas 183-188)