Struts 2 Validation - No client e server é possível?

11 respostas
renatocustodio

Pessoal, alguém sabe se da pra usar a validação do struts 2 tanto no client quanto no server? O motivo é que caso o javascript esteja desabilitado ainda assim ele deveria realizar a validação dos dados no servidor…

11 Respostas

pablofaria

Não trabalho com Struts, mais é sim possível, apenas valide com javascript no formulário e no servidor também,

mais na minha opinião, validações são de responsabilidade do servidor, imagine a seguinte situação:

Um usuário descobre seus parâmetros que são lançados via um formulário que você valida via javascript e os coloca na url

http://seuContexto/action.do?nome=Jose&id152

daí ele executa a ação sem poder…

renatocustodio

Exatamente por poder fazer isso que eu gostaria que validasse nos dois lados.

Mas eu não queria fazer o javascript para isso, e sim usar o javascript gerado pelo validador do framework, para não precisar escrever duas regras diferentes…

Colocando o parametro validate=“true” no meu form consigo realizar a validação no client usando o javascript gerado automaticamente, mas caso eu desabilite o javascript do browser ele não valida no servidor.

Retirando o validate=“true” apenas valida no server.

Como vc disse, eu mesmo escrever um javascript para isso resolveria, mas a intenção inicial era usar o javascript gerado pelo framework para não precisar duplicar regras de negócio…

juarezna

Renato, você conseguiu resolver esse problema?

andersondamasio

A sua action está extends ActionSuport?

juarezna

renatocustodio

Acho que não tem como, é um ou outro.
Mas estou fazendo usando ajax através do framework extjs. Dá mais trabalho, mas até que ta valendo a pena.

juarezna

Pois é… Já pesquisei bastante e tbem não encontrei uma forma…
Tudo bem que da versão 1 para a 2 do Struts tudo mudou, mas no Struts 1.xx isso era fácil de fazer…

Vou tentar mais um pouco, se descobrir algo retorno o tópico.

[]s

juarezna

Para funcionar no lado servidor basta colocar o arquivo xml de validação no mesmo package da classe action.
ex:
UsuarioAction-loginUsuario-validation.xml

onde:
UsuarioAction = Classe action
loginUsuario = nome do mapeamento (.do)

Porém, não consegui fazer funcionar no lado cliente…

rodrigo_corinthians

Em cima dos métodos que não precisarem de validação coloca a Annotation @SkipValidation.

thassiano

Olá pessoal,

Eu estou fazendo a validação de entrada do lado servidor no action. Por exemplo: No UsuarioAction eu tenho o seguinte código:

public String incluir() {
        try {
            if (verificarDadosIncluir()) {
                return SOLICITAR_INCLUSAO;
            }
            // ..... fazendo a inclusão
            return execute();
        } catch (MinhaException ex) {
            // ............ Tratamento da exceção
            addActionError("Erro");
            return SOLICITAR_INCLUSAO;
        }
    }

    private boolean verificarDadosIncluir() {
        boolean hasError = false;
        if (usuario != null && (usuario.getNome() == null
                || usuario.getNome().equals(""))) {
            hasError = true;
            addFieldError("nome", getText("view.nome.requerido"));
        }
        if (usuario != null && (usuario.getLogin() == null
                || usuario.getLogin().equals(""))) {
            hasError = true;
            addFieldError("login", getText("view.login.requerido"));
        }
        return hasError;
    }

E desta forma tem funcionado. Aproveitando, gostaria de perguntar se você já trabalharam com validação no struts 2 usando actions alias. Não encontrei muita coisa. Tenho o seguinte problema: No código acima tenho o método incluir() e quero colocar validação do lado cliente apenas para esse método do UsuarioAciton. E vi que posso fazer algo do tipo UsuarioAction-Usuario!incluir-validation.xml ao invés de UsuarioAction-validation.xml. Contudo, o action com alias não está funcionando, o que deve existir para ele funcionar? Não encontrei muita informação de como definir alias.

Desde já agradeço a ajuda!

thassiano

Olá Pessoal,

Ainda não está funcionando a validação com "actions alias". Vou colocar em detalhes como está configurado o meu projeto.

O meu jsp tem o seguinte formulário:
<s:form action="Usuario!pesquisar" validate="true">
      <s:textfield label="%{getText('view.usuario.nome')}" name="nome"/>
      <s:textfield label="%{getText('view.usuario.login')}" name="login" />
      <s:select list="perfis" label="%{getText('view.usuario.perfil')}"
                    listKey="id" listValue="nome" name="perfil.id"
                    headerKey="0" headerValue=" -- Selecionar -- " />
      <s:submit key="view.button.usuario.pesquisar" />
      <s:submit key="view.button.usuario.incluir" action="Usuario!solicitarInclusao" />
</s:form>
Quero que ao clicar no botão pesquisar (<s:submit key="view.button.usuario.pesquisar" />) seja chamada a validação que o struts2 gera a partir do arquivo de validação, que é ativado colocando no form validate="true". O meu UsuarioAction segue abaixo:
/**
 * AgendaAction extends ActionSupport.
 */
public class UsuarioAction extends AgendaAction {

    private List&lt;Usuario&gt; usuarios;
    private List&lt;Perfil&gt; perfis;
    private Usuario usuario;

    public String pesquisar() throws Exception {
        logger.info("pesquisar()");
        List&lt;Usuario&gt; lista = getAgenda().pesquisar(getLogin(), getNome(), getPerfil());
        setUsuarios(lista);
        setPerfis(getAgenda().listarPerfis());
        setUsuario(null);
        return SUCCESS;
    }

    public String getNome() {
        if (usuario != null) {
            return usuario.getNome();
        }
        return null;
    }

    public void setNome(String nome) {
        if (usuario == null) {
            usuario = new Usuario();
        }
        usuario.setNome(nome);
    }

    // Restante dos métodos, seguem o mesmo padrão do getNome e setNome.

}
O meu struts.xml é o seguinte:
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;
&lt;struts&gt;
    &lt;package name="default" extends="struts-default"&gt;

        &lt;action name="Logon!*" method="{1}" class="cc.co.taciano.agenda2.actions.LogonAction"&gt;
            &lt;result name="success"&gt;/paginas/home.jsp&lt;/result&gt;
            &lt;result name="input"&gt;/paginas/logon.jsp&lt;/result&gt;
        &lt;/action&gt;

        &lt;action name="Home" class="cc.co.taciano.agenda2.actions.AgendaAction"&gt;
            &lt;result&gt;/paginas/home.jsp&lt;/result&gt;
        &lt;/action&gt;

        &lt;action name="Usuario!*" method="{1}" class="cc.co.taciano.agenda2.actions.UsuarioAction"&gt;
            &lt;result&gt;/paginas/usuario/listar.jsp&lt;/result&gt;
            &lt;result name="solicitarInclusao"&gt;/paginas/usuario/incluir.jsp&lt;/result&gt;
            &lt;result name="solicitarAlteracao"&gt;/paginas/usuario/alterar.jsp&lt;/result&gt;
        &lt;/action&gt;

        &lt;action name="Contato" class="cc.co.taciano.agenda2.actions.ContatoAction"&gt;
            &lt;result&gt;/paginas/contato/listar.jsp&lt;/result&gt;
        &lt;/action&gt;

    &lt;/package&gt;
&lt;/struts&gt;
O arquivo de validação ficou com o nome UsuarioAction-Usuario!pesquisar-validation.xml. Fiz alguns pesquisar, e algumas páginas fazem referênca a um arquivo validation.xml. Contudo não encontrei referências deste arquivo e nem exemplos.
&lt;!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"&gt;

&lt;validators&gt;
    &lt;field name="login"&gt;
        &lt;field-validator type="requiredstring"&gt;
            &lt;message key="loginrequerido"/&gt;
        &lt;/field-validator&gt;
    &lt;/field&gt;
&lt;/validators&gt;
Já tentei colocar o field com o nome Usuario.login, e também não funcionou. Dei uma olhada no código gerado do JSP, ele gera um javascript para validação, mas não coloca a parte dos atributos. Já com a validação com action class que eu utilizo na tela de login ele gera corretamente o javascript.
&lt;script type="text/javascript"&gt;
    function validateForm_Logon() {
        form = document.getElementById("Logon");
        clearErrorMessages(form);
        clearErrorLabels(form);

        var errors = false;
        // field name: username
        // validator name: requiredstring
        if (form.elements['username']) {
            field = form.elements['username'];
            var error = "Login Requerido!";
            if (field.value != null && (field.value == "" || field.value.replace(/^\s+|\s+$/g,"").length == 0)) {
                addError(field, error);
                errors = true;
            }
        }
        // field name: password
        // validator name: requiredstring
        if (form.elements['password']) {
            field = form.elements['password'];
            var error = "Senha Requerida!";
            if (field.value != null && (field.value == "" || field.value.replace(/^\s+|\s+$/g,"").length == 0)) {
                addError(field, error);
                errors = true;
            }
        }

        return !errors;
    }
&lt;/script&gt;
O javascript do usuário não gera a parte de atributos.
&lt;script type="text/javascript"&gt;
    function validateForm_Usuario() {
        form = document.getElementById("Usuario");
        clearErrorMessages(form);
        clearErrorLabels(form);

        var errors = false;

        return !errors;
    }
&lt;/script&gt;

Alguém pode me indicar um caminho?

Criado 9 de março de 2008
Ultima resposta 24 de nov. de 2008
Respostas 11
Participantes 6