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));
}
}
<!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>
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);
}
}
<!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>
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;
}
}
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);
}
}
...
<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>
...