Dúvidas com carrinho de compras usando V-Raptor

4 respostas
C

Olá galera, estou tendo dificuldades nas validações de um carrinho de compras. Toda a parte de adição e remoção de itens no carrinho, cálculo de valores já estão funcionando perfeitamente. Acontece que preciso do seguinte requisito:
- Ao adicionar o mesmo item no carrinho apenas a quantidade deve ser aumentada, sem que na tela de listagem dos itens do carrinho o item apareça repetido em duas linhas.

Classe Item (armazena os dados do produto e quantidade de itens do carrinho):
package br.bmweb.bean;

public class Item {
	private Produto produto;
	private Integer quantidade;
	public Produto getProduto() {
		return produto;
	}
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
	public Integer getQuantidade() {
		return quantidade;
	}
	public void setQuantidade(Integer quantidade) {
		this.quantidade = quantidade;
	}

}
Classe CarrinhoController:
package br.bmweb.controller;

import java.util.List;

import br.bmweb.bean.Carrinho;
import br.bmweb.bean.Item;
import br.bmweb.bean.Produto;
import br.bmweb.dao.ProdutoDao;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class CarrinhoController {
	private final Carrinho carrinho;
	private final ProdutoDao dao;
	private final Result result;
	public CarrinhoController(Carrinho carrinho, ProdutoDao dao, Result result) {
		this.carrinho = carrinho;
		this.dao = dao;
		this.result = result;
	}

	/*@Get 
	@Path("/carrinho/carrinhoTeste")*/
	public void visualiza() {

	}

	public List<Produto> carrinhoTeste(){
		return dao.listaTudo();

	}

	/*@Post 
	@Path("/carrinho/carrinhoTeste")*/
	public void adiciona(Item item) {
		dao.recarrega(item.getProduto());
		carrinho.adiciona(item);
		//System.out.println("Itens: Controller: " + carrinho.getItens());
		result.redirectTo(CarrinhoController.class).visualiza();
	}

	//@Delete 
	//@Path("/carrinho/carrinhoTeste/{indiceItem}")
	/*public void remove(int indiceItem) {
	carrinho.remove(indiceItem);
	result.redirectTo(CarrinhoController.class).visualiza();
	}*/

	public void remove(int indiceItem) {
		carrinho.remove(indiceItem);
		result.redirectTo(CarrinhoController.class).visualiza();
	}
}
Classe Carrinho:
package br.bmweb.bean;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.Cookie;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class Carrinho {
	private List<Item> itens = new ArrayList<Item>();
	private Double total = 0.0;

	public List<Item> getItens() {
		return itens;
	}

	public void setItens(List<Item> itens) {
		this.itens = itens;
	}

	public Double getTotal() {
		return total;
	}

	public void setTotal(Double total) {
		this.total = total;
	}

	public void adiciona(Item item) {

		itens.add(item);
		total += item.getProduto().getValor() * item.getQuantidade();

		if(itens.indexOf(item.getProduto())){

		}

		System.out.println("Valor de itens: " + itens.indexOf(item.getProduto()));		
	}


	/*public void remove(int indiceItem) {
		Item removido = itens.remove(indiceItem);
		total -= removido.getProduto().getValor() * removido.getQuantidade();
	}*/

	public void remove(int indiceItem) {
		Item removido = itens.remove(indiceItem);
		total -= removido.getProduto().getValor() * removido.getQuantidade();
	}

	public Integer getTotalDeItens() {
		return itens.size();
	}

}
Página de visualização de itens do carrinho:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<h3>Itens do seu carrinho de compras</h3>
<table>
	<thead>
		<tr>
			<th>Descrição</th>
			<!-- <th>Preço</th> -->
			<th>Qtde</th>
			<!-- <th>Total</th> -->
		</tr>
	</thead>
	<tbody>
		<c:forEach items="${carrinho.itens}" var="item">
			<tr>
				<td>${item.produto.descricao_produto }</td> 
				<!-- <td><fmt:formatNumber type="currency" value="${item.produto.valor}" /></td> -->
				<td>${item.quantidade }</td>
				<!-- <td><fmt:formatNumber type="currency" value="${item.quantidade * item.produto.valor}" /></td> -->
			</tr>
			<form action="remove" method="POST">
				<button name="_method" value="DELETE">Remover</button>
			</form>
		</c:forEach>
	</tbody>
	<tfoot>
		<tr>
			<td colspan="2"></td>
			<!-- <th colspan="2">Total:</th> -->
			<!-- <th><fmt:formatNumber type="currency" value="${carrinho.total}" /></th> -->
		</tr>
	</tfoot>
</table>

</body>
</html>
Na linha 39 da classe Carrinho eu estou tentando verificar os itens existentes na lista(variável itens) e comparar com o produto que foi passado como parâmetro no método adiciona da classe carrinho (variável item). Acontece que essa comparação não estou sabendo como fazer esta comparação. Alguém tem alguma sugestão?

4 Respostas

Lucas_Cavalcanti

vc pode fazer algo do tipo:

boolean existe = false
for(Item exitente : itens) {
   if (existente.getProduto().equals(item.getProduto()) { //ou o jeito certo de se comparar que eles são iguais
         existente.setQuantidade(existente.getQuantidade() + item.getQuantidade());
         existe = true;
         break;
   }
}

if (!existe) {
     itens.add(item);
}
C

Lucas seguinte: eu tinha tentado uma solução muito parecida com esta sua, com esta lógica o comportamento continua o mesmo(cria duas linha pro mesmo produto). Pensei no seguinte que pode estar ocorrendo: Será que cada vez o array “itens” não está sendo zerado cada vez que o método “adiciona” da classe Carrinho termina de ser executado??

Lucas_Cavalcanti

cuidado com o equals

se vc não sobrescreveu o equals, duas instancias de produto, mesmo que tenham os mesmos atributos, são diferentes… vc tem que ver se eles são iguais, por exemplo, pelo id deles

C
Lucas mudei a comparação conforme sua sugestão e deu certo. A solução ficou assim: Classe Carrinho:
public void adiciona(Item item) {
		
		boolean existe = false ;
		for(Item existente : itens) {  
		   if (existente.getProduto().getCod_produto().equals(item.getProduto().getCod_produto())) { //ou o jeito certo de se comparar que eles são iguais  
		         existente.setQuantidade(existente.getQuantidade() + item.getQuantidade());  
		         existe = true;  
		         break;  
		   }  
		}  
		  
		if (!existe) {  
		     itens.add(item);  
		}	
	}
Criado 31 de julho de 2010
Ultima resposta 31 de jul. de 2010
Respostas 4
Participantes 2