[RESOLVIDO] - Formulario jsp não consegue recebe parametros para alterar dados (vraptor)

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 :slight_smile:
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 :slight_smile:
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!