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