Como mantenho os dados no formulário após erro encontrado pelo método validate do actionForm?

7 respostas
M

Oi Pessoal,

Tenho uma jsp que lista os livros cadastrados, tendo para cada item da lista, um rádio associado ao código do livro. Um vez selecionado o código atráves de um rádio e feito o request, a tela de alteração de livros aparece com os dados carregados para alteração.

Quando faço a alteração sem deixar campo em branco e/ou com valores com tipos compatíveis com os tipos do banco, a alteração transcorre perfeitamente e exibe a jsp de confirmação de alteração.

O meu problema no entanto está na execução do método validate do ActionForm da tela de alteração de livro, quando este encontra algum erro de validação.

Para testar o validate em LivroAlteracaoActionForm, dou submit na jsp, com os dados do livro para alteração, deixando um campo em branco, por exemplo. O validate é executado certinho para o campo não preenchido, exibindo no vetor de erros apenas o erro daquele campo não preenchido. Mas, "zera" todo formulário.

Fiz o mesmo procedimento para a tela de inclusão de livro, deixando um campo em branco para testar o validate do seu respectivo actionForm (LivroActionForm), e a tela de inclusão de livro retorna o vetor de erro informando o campo não preenchido, mas mantém os demais campos que já estavam preenchidos. Pq então tá zerando na alteração ??? Essa é a dúvida. Acho que terei que trabalhar com sessão mas não sei como fazer. Se alguém puder me ajudar ... .

Abaixo mostro os códigos das jsps da lista e da tela de alteração de livro, dos seus respectivos Actions e ActionForms e do trecho no struts-config.

Se alguém souber como me ajudar agradeço muito.

[]s.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Action que exibe a Lista:
public class ListarLivrosAlteracaoAction extends org.apache.struts.action.Action {
    
    private final static String SUCCESS = "listaAlteracaoLivros";
    
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        LinkedList livros = new LinkedList();
        MidiaDAO operacao = new MidiaDAO();
        livros = operacao.listarLivros();
        request.setAttribute("livros", livros);
        return (mapping.findForward(SUCCESS));
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// JSP da Lista de livros com radiobuttons - chamada por ListarLivrosAlteracaoAction
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-bean" prefix="bean" %>   
<%@ taglib uri="/WEB-INF/struts-html" prefix="html" %>   
<%@ taglib uri="/WEB-INF/struts-logic" prefix="logic" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>   
<jsp:useBean id="opcao" scope="request" class="controles.ActionForms.OpcaoAlteracaoActionForm"/>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title><bean:message key="titulo.lista.alteracao.livro"/></title>
    </head>
    <body>
        <center><h1><bean:message key="cabecalho.lista.alteracao.livro"/></h1><center>
        <html:form action="/acionarAlteracaoLivro.do">   
            <logic:present name="livros"/>
                <table border="1">   
                    <tr>   
                        <td>Código          </td>   
                        <td>ISBN            </td>   
                        <td>Título          </td>   
                        <td>Autor           </td>   
                        <td>Assunto         </td>   
                        <td>Editora         </td>   
                        <td>Nº Edição       </td>   
                        <td>Ano             </td>   
                        <td>Total de Páginas</td>   
                        <td>Tipo de Mídia   </td>   
                    </tr>
                    <logic:iterate id="livro" indexId="index" scope="request" name="livros">
                    <tr>    
                        <td><c:set var="radio" value="${livro.codigo}"/>
                            <html:radio name="opcao" property="opcao" value="${radio}"/>
                            <bean:write name="livro" property="codigo"    /></td>
                        <td><bean:write name="livro" property="isbn"      /></td>
                        <td><bean:write name="livro" property="titulo"    /></td>
                        <td><bean:write name="livro" property="autor"     /></td>
                        <td><bean:write name="livro" property="assunto"   /></td>
                        <td><bean:write name="livro" property="editora"   /></td>
                        <td><bean:write name="livro" property="numEdicao" /></td>
                        <td><bean:write name="livro" property="ano"       /></td>
                        <td><bean:write name="livro" property="qtdPaginas"/></td>
                        <td><bean:write name="livro" property="tipoMidia" /></td>
                    </tr>
                    </logic:iterate>    
                </table>        
                <html:submit property="botao" value="Alterar Livro">
                    <bean:message key="botao.lista.alteracao.livro.sumit"/>
                </html:submit>   
        </html:form>   
    </body>
</html>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ActionForm da Lista:
public class OpcaoAlteracaoActionForm extends org.apache.struts.action.ActionForm {
    private String opcao;// mesmo nome da propriedade name do rádio em listaLivrosalteração.jsp

    public String getOpcao() {
        return opcao;
    }

    public void setOpcao(String opcao) {
        this.opcao = opcao;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Action chamada pela JSP da Lista para exibir a tela de alteração:

public class acionarAlteracaoLivroAction extends org.apache.struts.action.Action {
    
    private final static String SUCCESS = "telaAlteracaoLivro";
    
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        String opcao;
        OpcaoAlteracaoActionForm opcaoForm = (OpcaoAlteracaoActionForm)form;

        opcao = opcaoForm.getOpcao();

        Livro livro = new Livro();
        MidiaDAO operacao = new MidiaDAO();       
        livro = operacao.obterLivro(Integer.parseInt(opcao));
        operacao.fechaConexao();
        
        LivroAlteracaoActionForm livroForm = new LivroAlteracaoActionForm();      
        
        BeanUtils.copyProperties(livroForm,livro);
        request.setAttribute("livro", livroForm);
        return mapping.findForward(SUCCESS);
    }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// JSP da Tela de Alteração de Livro
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-bean" prefix="bean" %>   
<%@ taglib uri="/WEB-INF/struts-html" prefix="html" %>   
<%@ taglib uri="/WEB-INF/struts-logic" prefix="logic" %>

<jsp:useBean id="livro" scope="request" class="controles.ActionForms.LivroAlteracaoActionForm"/>

<html>   
    <head>   
    <title><bean:message key="titulo.alteracao.livro"/></title>   
    </head>   
    <body>   
        <h1><bean:message key="cabecalho.alteracao.livro"/></h1>   
        <html:errors/><!--LISTA OS ERROS DE PREENCHIMENTO DOS CAMPOS -->
        <html:form action="/AlterarLivro.do" focus="isbn">   
            <table>   
                <tr>   
                    <td>Código:</td>
                    <td><bean:write name="livro" property="codigo"/></td>   
                </tr>   
                <tr>   
                    <td >ISBN:</td>   
                    <td><html:text name="livro" property="isbn"/></td>   
                </tr>   
                <tr>   
                    <td >Título:</td>   
                    <td><html:text name="livro" property="titulo"/></td>   
                </tr>   
                <tr>   
                    <td >Autor:</td>   
                    <td><html:text name="livro" property="autor"/></td>   
                </tr>   
                <tr>   
                    <td >Assunto:</td>   
                    <td><html:text name="livro" property="assunto"/></td>   
                </tr>   
                <tr>   
                    <td >Editora:</td>   
                    <td><html:text name="livro" property="editora"/></td>   
                </tr>   
                <tr>   
                    <td >Nº Edição:</td>   
                    <td><html:text name="livro" property="numEdicao"/></td>   
                </tr>   
                <tr>   
                    <td >Ano:</td>   
                    <td><html:text name="livro" property="ano"/></td>   
                </tr>   
                <tr>   
                    <td>Total de Páginas:</td>   
                    <td><html:text name="livro" property="qtdPaginas"/></td>   
                </tr>
                <tr>    
                    <td>Tipo de Mídia:</td>   
                    <td><html:text name="livro" property="tipoMidia"/></td>   
                </tr>
            </table>   
            <html:submit><bean:message key="botao.sumit"/></html:submit>   
        </html:form>   
    </body>   
</html>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ActionForm da Tela de Alteração de Livro
public class LivroAlteracaoActionForm extends org.apache.struts.action.ActionForm {
    
    private int    codigo;
    private int    isbn;
    private String titulo;
    private String autor;
    private String assunto;
    private String editora;
    private int    numEdicao;
    private int    ano;
    private int    qtdPaginas;
    private String tipoMidia;

    //Getters & Setters

    public LivroAlteracaoActionForm() {
       super();
       // TODO Auto-generated constructor stub
   }

   public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {

       ActionErrors errors = new ActionErrors();

       //não trato o campo código pq só será exibido e não editado para alteração       

       if (getIsbn() == 0) {
           errors.add("isbn", new ActionMessage("erro.inclusao.isbn"));
       }
       if (getTitulo() == null || getTitulo().length() < 1) {
           errors.add("titulo", new ActionMessage("erro.inclusao.tituloLivro"));
       }
       if (getAutor() == null || getAutor().length() < 1) {
           errors.add("autor", new ActionMessage("erro.inclusao.autor"));
       }
       if (getAssunto() == null || getAssunto().length() < 1) {
           errors.add("assunto", new ActionMessage("erro.inclusao.assunto"));
       }
       if (getEditora() == null || getEditora().length() < 1) {
           errors.add("editora", new ActionMessage("erro.inclusao.editoraLivro"));
       }
       if (getNumEdicao() == 0) {
           errors.add("numEdicao", new ActionMessage("erro.inclusao.numEdicao"));
       }
       if (getAno() == 0) {
           errors.add("ano", new ActionMessage("erro.inclusao.anoLivro"));
       }
       if (getQtdPaginas() == 0) {
           errors.add("qtdPaginas", new ActionMessage("erro.inclusao.qtdPaginas"));
       }
       if (getTipoMidia() == null || getTipoMidia().length() < 1) {
           errors.add("tipoMidia", new ActionMessage("erro.inclusao.tipoMidiaLivro"));
       }      
       return errors;
   }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Action da Tela de Alteração de Livro
public class AlterarLivroAction extends org.apache.struts.action.Action {
    
    private final static String SUCCESS = "livroAlterado";
    
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        LivroAlteracaoActionForm livroForm = (LivroAlteracaoActionForm) form;
        Livro livro = new Livro();
        BeanUtils.copyProperties(livro, livroForm);
        
        MidiaDAO operacao = new MidiaDAO();
        operacao.alterarLivro(livro);
        operacao.fechaConexao();
        request.setAttribute("livro", livro);
        return mapping.findForward(SUCCESS);
    }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struts-config.xml
...
    <form-beans>
        // ... todos os beans estão declarados   
    </form-beans>

    <global-forwards>
        ...
        <forward name="exibeListaLivrosAlteracao"   path="/ListarLivrosAlteracao.do"/>
        <forward name="listaAlteracaoLivros"        path="/acionarAlteracaoLivro.do"/>
        <forward name="telaAlteracaoLivro"          path="/AlterarLivro.do"/>
        ...
    </global-forwards>
        ...
    <action-mappings>
        ...
        <action path="/ListarLivrosAlteracao"
                name="OpcaoAlteracaoActionForm"
                type="controles.Actions.ListarLivrosAlteracaoAction"  
                scope="request"         validate="false">   
                <forward name="listaAlteracaoLivros"       path="/listaAlteracaoLivros.jsp"/>                
        </action>       

        <action path="/acionarAlteracaoLivro"
                name="OpcaoAlteracaoActionForm"  
                type="controles.Actions.acionarAlteracaoLivroAction"  
                scope="request"         validate="false">   
                <forward name="telaAlteracaoLivro"       path="/telaAlteracaoLivro.jsp"/>                
        </action>       

        <action path="/AlterarLivro"
                name="LivroAlteracaoActionForm"  type="controles.Actions.AlterarLivroAction"  
                input="/telaAlteracaoLivro.jsp" 
                scope="request" validate="true">   
                <forward name="livroAlterado"       path="/telaConfirmacaoAlteracaoLivro.jsp"/>                
        </action>       
        ...
    </action-mappings>
    ...

7 Respostas

alanbrasil1984

Grande colega de prof vou ver se te ajudo mais acredito que seu problema seja…

AO invés de usar Request.setAttribute

Use

Session.setAttribute…

porque ai vc vai manter os dados dos FORMS na sessão e ele não o perderá…

Espero ter ajudados…

M

Oi Alan,

veja se estou certa então. Teria que fazer as seguintes alterações:

1 - na jsp que exibe o formulário para alteração com os dados do livro:

ao invés de:
<jsp:useBean id=“livro” scope=“request” class=“controles.ActionForms.LivroAlteracaoActionForm”/>

eu colocaria:
<jsp:useBean id=“livro” scope=“session” class=“controles.ActionForms.LivroAlteracaoActionForm”/>

2 - na action AlterarLivro.do da jsp acima:

ao invés de:
request.setAttribute(“livro”, livro);

eu colocaria:
session.setAttribute(“livro”, livro);

3 - no struts-config.xml:

ao invés de :

<action path="/AlterarLivro" name="LivroAlteracaoActionForm" type="controles.Actions.AlterarLivroAction" input="/telaAlteracaoLivro.jsp" scope="request" validate="true"> <forward name="livroAlterado" path="/telaConfirmacaoAlteracaoLivro.jsp"/> </action>

eu colocaria:

<action path="/AlterarLivro" name="LivroAlteracaoActionForm" type="controles.Actions.AlterarLivroAction" input="/telaAlteracaoLivro.jsp" scope="session" validate="true"> <forward name="livroAlterado" path="/telaConfirmacaoAlteracaoLivro.jsp"/> </action>

É isso ???

Agradeço muito se puder ajudar vlw ???

alanbrasil1984

sim minha linda…

vc matou a charada…

beijos e espero ter ajudado…

Alessandro_Lazarotti

Coloque os dados na sessão e acabe com a escalabilidade de sua aplicação.

leofernandesmo

Putz…colocar tudo na sessão é um tiro no pé.

leofernandesmo

Só uma pergunta…eu não li o seu post todo. É Struts 2 né?
IF sim…
O próprio Struts faz bind dos “componentes HTML” com os atributos da Action, basta colocar o mesmo nome.
IF não…
Desculpa…não sei como ajudar.

M

Olá pessoal,

Antes de mais nada agradeço aos colegas que estão me ajudando e esclareço a um deles que o struts que utilizo não é o 2. mas de qq forma agradeço a gentileza de responder. Obrigada.

Aos coleguinhas que me responderam para usar sessão: comecei a fazer as mudanças sugeridas pelo Alan. Pôxa mas já começou a dar o seguinte erro na jsp: Usebean: Duplicate bean name: livro. Alguém pode me dizer porque isso e como resolvo ??? segue abaixo minha jsp:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-bean" prefix="bean" %>   
<%@ taglib uri="/WEB-INF/struts-html" prefix="html" %>   
<%@ taglib uri="/WEB-INF/struts-logic" prefix="logic" %>

<!--<<jsp:useBean id="livro" scope="request" class="controles.ActionForms.LivroActionForm"/>-->

<jsp:useBean id="livro" scope="session" class="controles.ActionForms.LivroActionForm"/>


<html>   
    <head>   
    <title><bean:message key="titulo.alteracao.livro"/></title>   
    </head>   
    <body>   
        <h1><bean:message key="cabecalho.alteracao.livro"/></h1>   
        <html:errors/><!--LISTA OS ERROS DE PREENCHIMENTO DOS CAMPOS -->
        <html:form action="/AlterarLivro.do" focus="isbn">   
            <table>   
                <tr>   
                    <html:hidden name="livro" property="codigo"/>
                    <td>Código:</td>
                    <td><bean:write name="livro" property="codigo"/></td>   
                </tr>   
                <tr>   
                    <td >ISBN:</td>   
                    <td><html:text name="livro" property="isbn"/></td>   
                </tr>   
                <tr>   
                    <td >Título:</td>   
                    <td><html:text name="livro" property="titulo"/></td>   
                </tr>   
                <tr>   
                    <td >Autor:</td>   
                    <td><html:text name="livro" property="autor"/></td>   
                </tr>   
                <tr>   
                    <td >Assunto:</td>   
                    <td><html:text name="livro" property="assunto"/></td>   
                </tr>   
                <tr>   
                    <td >Editora:</td>   
                    <td><html:text name="livro" property="editora"/></td>   
                </tr>   
                <tr>   
                    <td >Nº Edição:</td>   
                    <td><html:text name="livro" property="numEdicao"/></td>   
                </tr>   
                <tr>   
                    <td >Ano:</td>   
                    <td><html:text name="livro" property="ano"/></td>   
                </tr>   
                <tr>   
                    <td>Total de Páginas:</td>   
                    <td><html:text name="livro" property="qtdPaginas"/></td>   
                </tr>
                <tr>    
                    <td>Tipo de Mídia:</td>   
                    <td><html:text name="livro" property="tipoMidia"/></td>   
                </tr>
            </table>   
            <html:submit><bean:message key="botao.sumit"/></html:submit>   
        </html:form>   
    </body>   
</html>

Conto com a super ajuda dos meus coleguinhas java men vlw :thumbup: ;-).

[ ]'s,
Mônica.

Criado 9 de junho de 2008
Ultima resposta 10 de jun. de 2008
Respostas 7
Participantes 4