Posts Tagged ‘validate’

Struts2 Validation utilizando valores armazenados em sessão

29/11/2009

Esses dias estava desenvolvendo no projeto aqui da Globo.com e tive que fazer a validação de um formulário (server-side) . Decidimos por usar o validation do struts2, já que estamos usando o framework no projeto. Na parte client-side, todas as validações são feitas com JQuery/Ajax.

Acabei me deparando com ums situação que foi um tanto chata pra resolver. Eis que segue aproximadamente um exemplo do que passei. Estou simplificando pra não ter que colocar todo o código fonte aqui!

Digamos que você tenha um formulário que é exibido após o usuário se autenticar e esse formulário tem alguns campos que não devem aparecer em uma determinada situação.

De acordo com o código jsp abaixo, apenas o campo nomeTitular deve ser apresentado quando a variável “titular” armazenada na sessão for true.

<s:form name="formCadastro" action="salvar-segunda-compra.action" method="post" validate="true">
   <s:if test="#session.tipoPessoa == 'F'">
      <s:textfield name="cpf"/>
   </s:if>
   <s:else>
      <s:textfield name="cnpj"/>
   </s:else>
</s:form>

Feito isso, temos que fazer a validação do formulário com o validation do Struts2.

Para tal, basta acrescentar um xml com o mesmo nome da classe da action concatendando “-validation.xml”, ficando assin: <ActionClassName>-validation.xml (deve ficar em /WEB-INF/classes). Leia mais sobre validation aqui http://struts.apache.org/2.x/docs/validation.html

Num caso como esse, onde se é necessário utilizar um valor armazenado em sessão,  podemos considerar o validation como se fosse um jsp!

O trecho de código abaixo é a versão final do que acabei desenvolvendo:

...
<field name="cpf">
   <field-validator type="fieldexpression" short-circuit="true">
      <param name="expression">
         <![CDATA[((titularOuOutros == "T") || (tipoPagante == "J") || (cpf != ""))]]>
      </param>
      <message key="cpf-obrigatorio" />
   </field-validator>
   <field-validator type="cpf">
      <param name="permiteVazio">
         <![CDATA[((#session.cesta_valor_zero) || (titularOuOutros == "T") || (tipoPagante == "J"))]]>
      </param>
      <message key="cpf-invalido"/>
   </field-validator>
</field>
...

Conforme demonstrado acima, é possível usar valores armazenados em sessão para fazer validação de formulário.

Não é necessário declarar uma propriedade a mais na action e colocar uma informação desnecessária em um “<s:hidden../>” apenas para poder usar o mesmo no validation.

Qualquer dúvida, nao se acanhem e podem perguntar!

Abs