Pessoal,
Criei um formulário JSP para editar (alterar) dados de um objeto num uso com VRaptor. Infelizmente o formulário não esta recebendo os parametros do objeto setados na URI (via EL) pela lista.jsp para preencher os campos já no carregamento inicial do formulárioAtualiza.jsp.
Já alterei de diversas formas o EL mas sem sucesso.
As lógicas do CRUD estão funcionando.
Como resolver? O problema é no método do formulário no Controller?
Abaixo os códigos. Para simplificar, nestes códigos estou tentando pegar apenas o id para jogar no campo.
lista.jsp
<html>
<body>
<a href="<c:url value="/cap16-t09-e08/produto/formularioAdiciona"/>">Adicionar produto</a>
<table>
<c:forEach var="produto" items="${produtoList}">
<tr>
<td>${produto.nome}</td>
<td>${produto.preco}</td>
<td>${produto.descricao}</td>
<td><fmt:formatDate pattern="dd/MM/yyyy" value="${produto.dataInicioVenda.time}" /></td>
<td><a href="<c:url value="/cap16-t09-e08/produto/remove"/>?produto.id=${produto.id}">Remover</a> </td>
<td><a href="<c:url value="/cap16-t09-e08/produto/formularioAtualiza"/>?produto.id=${produto.id}">Atualizar</a> </td>
</tr>
</c:forEach>
</table>
</body>
</html>
formularioAtualiza.jsp
[code]
<form action="<c:url value="/cap16-t09-e08/produto/atualiza"/>" />
Id: <input name="produto.id" value="${produto.id}" disabled="disabled"/> <br />
Nome: <input name="produto.nome" "/> <br/>
Descricao: <input name="produto.descricao" "/> <br/>
Preco: <input name="produto.preco" "/> <br/>
Data de inicio da venda: <caelum:campoData id="dataInicioVenda" name="produto.dataInicioVenda" /> <br/>
<input type="submit" name="Atualizar produto">
</form>
</body>
[/code]
ProdutosController
@Resource
@Path("/cap16-t09-e08/produto")
public class ProdutoController {
private Result result;
public ProdutoController(Result result){
this.result = result;
}
//a ação adiciona
public void adiciona(Produto produto){
new ProdutoDAO().adiciona(produto);
result.redirectTo(ProdutoController.class).lista();
}
//a ação atualiza
public void atualiza(Produto produto){
new ProdutoDAO().atualiza(produto);
result.redirectTo(ProdutoController.class).lista();
}
//a ação remove
public void remove(Produto produto){
new ProdutoDAO().remove(produto);
result.redirectTo(ProdutoController.class).lista();
}
public List<Produto> lista(){
return new ProdutoDAO().lista();
}
public void formularioAdiciona(){
}
public void formularioAtualiza(){
}
}
cara, não sei se ajuda, mas gostaria de fazer duas observações:
new ProdutoDAO()
Pq não faz isso via injeção de dependencia?
Outra coisa, poderia aproveitar o mesmo jsp de formulario tanto para
editar quanto para salvar
poderia usar o
<c:if > //..
pra ver se o objeto recebido no forumulario ‘isEmpty’
desculpa por não poder opinar sobre o teu erro.
bom dia,
essa linha
<td><a href="<c:url value="/cap16-t09-e08/produto/formularioAtualiza"/>?produto.id=${produto.id}">Atualizar</a> </td>
vai chamar o metodo
public void formularioAtualiza(){
}
pra que seu formulario seja populado vc vai precisar alterar o metodo formularioAtualiza do seu controller.
public void formularioAtualiza(Produto produto){
//faz consulta usando id do produto do parametro
//usar o result para incluir o produto ao request
}
outra coisa, coloque o parametro dentro do <c:url:
<c:url value="/cap16-t09-e08/produto/formularioAtualiza?produto.id=${produto.id}"/>
[quote=d34d_d3v1l]cara, não sei se ajuda, mas gostaria de fazer duas observações:
new ProdutoDAO()
Pq não faz isso via injeção de dependencia?
Outra coisa, poderia aproveitar o mesmo jsp de formulario tanto para
editar quanto para salvar
poderia usar o
<c:if > //..
pra ver se o objeto recebido no forumulario ‘isEmpty’
desculpa por não poder opinar sobre o teu erro.[/quote]
Tranquilo. Pode opinar a vontade!
Tuas colocações foram excelentes! Sobre reaproveitar o form, concordo também. Mas foi opção minha mesmo, para poder (bagunçar) testar o método altera, pois sabia que iria apanhar no campo data rsrs. Então resolvi copiar o form para brincar com o altera e deixar o form original para inserção, normal e funcionando.
Mas o correto é fazer do modo que você sugere.
[quote=Lucas Cavalcanti]outra coisa, coloque o parametro dentro do <c:url:
<c:url value="/cap16-t09-e08/produto/formularioAtualiza?produto.id=${produto.id}"/>
[/quote]
Obrigado pela dica, Lucas.
[quote=DaniloAndrade]bom dia,
essa linha
<td><a href="<c:url value="/cap16-t09-e08/produto/formularioAtualiza"/>?produto.id=${produto.id}">Atualizar</a> </td>
vai chamar o metodo
public void formularioAtualiza(){
}
pra que seu formulario seja populado vc vai precisar alterar o metodo formularioAtualiza do seu controller.
public void formularioAtualiza(Produto produto){
//faz consulta usando id do produto do parametro
//usar o result para incluir o produto ao request
}
[/quote]
Danilo, grato pela resposta. Confirma o que estava suspeitando rsrs (o tal do Controller).
Resposta ao problema.
Bom para finalizar o tópico, segue a resposta que finalizei alguns dias atrás:
ProdutoController
[code]ProdutoController{
//... os outros métodos e atributos
public void formularioAtualiza(Produto produto){
Long idProcurado = produto.getId();
Produto encontrado = produtoDAO.busca(idProcurado);
result.include(encontrado);
}
}[/code]
formularioAtualiza.jsp
[code]
<body>
<form action="<c:url value="/produto/atualiza"/>" />
Id: <input name="produto.id" value="${produto.id}" readonly="readonly"/> <br />
Nome: <input name="produto.nome" value="${produto.nome}"/> <br/>
Descricao: <input name="produto.descricao" value="${produto.descricao}"/> <br/>
Preco: <input name="produto.preco" value="${produto.preco}"/> <br/>
Data de inicio da venda: <caelum:campoData id="dataInicioVenda" name="produto.dataInicioVenda" value="${produto.dataInicioVenda.time}"/> <br/>
<input type="submit" name="Atualizar produto">
</form>
</body>
[/code]
E algumas páginas que podem ajudar:
http://vraptor.caelum.com.br/documentacao/view-e-ajax/
http://www.guj.com.br/java/209602-resolvido-alimentar-diversos-select-na-pagina-vraptorhibernate/2
http://www.lucas.hgt.nom.br/wordpress/?p=170 (Esta ajudou muito! simples e direto)
http://vraptor.caelum.com.br/documentacao/vraptor3-guia-de-1-minuto/
Falta fazer as boas práticas sugeridas (aqui mesmo) como a injeção e usar o mesmo form para ambas as funções de inclusão e alteração de dados.
Problema resolvido!