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

7 respostas
paulolimac

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

<html>
	<body>

		<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>
</html>

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(){
		
	}
	
}

7 Respostas

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.

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
}
Lucas_Cavalcanti

outra coisa, coloque o parametro dentro do <c:url:

<c:url value="/cap16-t09-e08/produto/formularioAtualiza?produto.id=${produto.id}"/>
paulolimac

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.

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.

paulolimac

Lucas Cavalcanti:
outra coisa, coloque o parametro dentro do <c:url:

<c:url value="/cap16-t09-e08/produto/formularioAtualiza?produto.id=${produto.id}"/>

Obrigado pela dica, Lucas.

paulolimac

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
}

Danilo, grato pela resposta. Confirma o que estava suspeitando rsrs (o tal do Controller).

paulolimac

Resposta ao problema.

Bom para finalizar o tópico, segue a resposta que finalizei alguns dias atrás:

ProdutoController
ProdutoController{

        //... os outros métodos e atributos

        public void formularioAtualiza(Produto produto){
                Long idProcurado = produto.getId();
                Produto encontrado = produtoDAO.busca(idProcurado);
                result.include(encontrado);
        }
}
formularioAtualiza.jsp
<html>
       
        <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>
</html>

E algumas páginas que podem ajudar:

[url]http://vraptor.caelum.com.br/documentacao/view-e-ajax/[/url]
[url]http://www.guj.com.br/java/209602-resolvido-alimentar-diversos-select-na-pagina-vraptorhibernate/2[/url]
[url]http://www.lucas.hgt.nom.br/wordpress/?p=170[/url] (Esta ajudou muito! simples e direto)
[url]http://vraptor.caelum.com.br/documentacao/vraptor3-guia-de-1-minuto/[/url]

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!

Criado 9 de julho de 2012
Ultima resposta 16 de jul. de 2012
Respostas 7
Participantes 4