Projeto web Duvidas - Carrinho de Compra

Boa tarde pessoal

Estou com o seguinte problema:

Estou desenvolvendo um ecommerce pra facul e estou fazendo um carrinho…

tenho uma action que lista todos os produtos para o cliente,através do jsp e dentro do jsp tem um botão comprar(em cada produto). Quando vc clica no botão comprar, esse produto tem que ser enviado para outra Action,q seria a Action do carrinho, onde ele fica em uma sessão e dpois finaliza a compra.
Está aparecendo a lista normal, mas qdo clico no botão comprar, dá o seguinte erro:

exception

javax.servlet.ServletException: java.lang.ClassCastException: br.com.ecommerce.model.bean.Produto
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:520)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:427)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause 

Ah minha Action está da seguinte forma:


package struts.action;

import br.com.ecommerce.model.bean.ItemPedido;
import br.com.ecommerce.model.bean.Produto;
import br.com.ecommerce.model.dao.ProdutoDao;
import br.com.ecommerce.model.dao.impl.ProdutoDaoImpl;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

public class ItensAction extends org.apache.struts.action.Action {
    
    private final static String SUCCESS = "carrinho";
    
    
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        
        Integer IdProduto = new Integer(request.getParameter("produtoId"));
        HttpSession session = request.getSession(true);
        List<ItemPedido> lista =(List<ItemPedido>) session.getAttribute(SUCCESS);
        
        
        if(lista == null){
            lista = new ArrayList<ItemPedido>();
        }
        
        boolean existe = false;
        
        for(ItemPedido item : lista){
           if(item.getProduto().getId() == IdProduto){
               item.setQuantidade(item.getQuantidade()+1);
               //item.setTotal(item.getValorUnitario().multiply(new BigDecimal(item.getQuantidade())));
               item.setTotal(item.getValorUnitario().multiply(item.getValorUnitario(), new MathContext(item.getQuantidade())));
               
               existe = true;
           }
        }
        if(existe == false){
            ProdutoDao mProduto = new ProdutoDaoImpl();
            Produto bProduto = mProduto.getProduto(IdProduto);
            ItemPedido bean = new ItemPedido();
            bean.setId(IdProduto);
            bean.setQuantidade(1);
            bean.setProduto(bProduto);
            bean.setValorUnitario(bProduto.getValor());
            bean.setTotal(bProduto.getValor().multiply(new BigDecimal(bean.getQuantidade())));               

            lista.add(bean);
        }
       session.setAttribute("carrinho",lista);
       
       //calcula o valor da compra
       BigDecimal total = new BigDecimal(0);
       for(ItemPedido item: lista){
           total = total.add(item.getTotal());
       }
       session.setAttribute("total",total);
       
        return mapping.findForward(SUCCESS);
        
    }
}

Quando debugo o projeto, dá erro nessa linha

for(ItemPedido item : lista){

Alguem sabe me dizer o pq???

Ah, a minha Action inicial, que lista os produtos é essa


public class PedidoAction extends org.apache.struts.action.Action {    

    private final static String SUCCESS = "venda";
  
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        HttpSession session = request.getSession();
        int codigo;
        List<Produto> lista;
        ProdutoDao dao = new ProdutoDaoImpl();
        try{
            lista = dao.listaPedido();   
        }catch(Exception ex){
            lista = dao.lista();
        }
        session.setAttribute("lista", lista);
        session.setAttribute("carrinho", lista);
        return mapping.findForward(SUCCESS);
        
    }
}

Pessoa, POR FAVOR, me ajudem…estou ha 3 meses desenvolvendo esse projeto e agr a professora pediu pra completar uma compra e eu não sei como fzer…E tenho que entregar amanha…

TEM que ser em Struts 1 =/

Desde já agradeço!

oi brother…

olhando rapidamente…pelo que vi na ação que lista os pedidos…vc seta na sessão uma lista de produtos: List<Produto>
e na ação seguinte, você tenta recuperar da sessao uma lista de ItemPedido = List<ItemPedido>.
Por isso o ClassCastException…

t+

DianaPJ

Eu tinha percebido isso

Mudei algumas coisas, fui usar DispatchAction, mas ta dando esse erro:

exception

javax.servlet.ServletException: Request[/vendas] does not contain handler parameter named 'method'.  This may be caused by whitespace in the label text.
	org.apache.struts.actions.DispatchAction.unspecified(DispatchAction.java:197)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:245)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

Alguem sabe oq é? =/

vc está usando Struts neh…
na sua action, vc mapeou o parametro…?
Aparentemente está reclamando que não existe relaçao para um “parameter method”

t+

Então, meu struts-config está assim

&lt;action parameter="method" path="/vendas" type="struts.action.ItensAction"&gt;
        &lt;forward name="vendas" path="/ListaCarrinho.jsp"/&gt;        
    &lt;/action&gt;

E eu estou chamando assim no jsp

&lt;form action="vendas.do" method="add" name="form&lt;jsp:getProperty name="bean" property="idProduto" /&gt;&quot;&gt;   

Pode ser algo aqui?

Veja…

  &lt;action name="ChamadaForm" parameter="acao" path="/chamada"   scope="request" type="xxx.xxx.xxx." validate="false"&gt;
.....

e a chamada no form…

&lt;form name="add" action="&lt;%=request.getContextPath()%&gt;/chamada.htm?acao=adicionaChamadaEnvioEmail" method="post"&gt;

Continua dando erro =/

Vou postar o jsp pra vc ver…


&lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;
&lt;%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %&gt;
&lt;%@taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;
&lt;%@page contentType="text/html"%&gt;
&lt;script type="text/javascript"&gt;
            function submitForm()
            {
                document.forms[0].action = "vendas.do?method=add";
                document.forms[0].submit();
            }
        &lt;/script&gt;
    &lt;table width="100%"&gt;
        &lt;c:choose&gt;
            &lt;c:when test="${!empty carrinho}"&gt;
        &lt;c:forEach  var="bean" items="${carrinho}"&gt;
        &lt;tr&gt;
            &lt;td width="150px" align="center"&gt;<img bean"  />.gif&quot; /&gt;&lt;/td&gt;
            &lt;td&gt;<a  bean"  />&quot;&gt;&lt;jsp:getProperty name="bean" property="nomeProduto"/&gt;</a>&lt;/td&gt;
            
            &lt;td&gt;
            &lt;form name="add" action="&lt;%=request.getContextPath()%&gt;/vendas.do?acao=add" method="post"&gt;  
                    &lt;input type="text" name="quantidade" size="3" style="text-align: center;" value="&lt;jsp:getProperty name="bean" property="quantidade" /&gt;&quot;&gt;&nbsp;
                    &lt;input type="hidden" name="idProduto" value="&lt;jsp:getProperty name="bean" property="idProduto" /&gt;&quot; /&gt;
                    &lt;input type="hidden" name="metodo" value="atualiza" /&gt;
                    &lt;td&gt;
                    <a bean"  />.submit();&quot;&gt;
                        <img   />
                    </a>
                    &lt;/td&gt;
            &lt;/form&gt;
            &lt;/td&gt;
            &lt;td&gt;<a bean"  />&method=exclui&quot;&gt;<img  /></a>                &lt;/td&gt;            
            &lt;td align="center" width="80px" class="preco"&gt;R$ &lt;jsp:getProperty name="bean" property="valor"/&gt;&lt;/td&gt;
            &lt;td align="center" width="80px" class="preco"&gt;R$ &lt;jsp:getProperty name="bean" property="total"/&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;/c:forEach&gt;
        &lt;tr&gt;
            &lt;td align="center"&gt;
                <a >
                    <img   />
                </a>
            &lt;/td&gt;
            &lt;td align="center"&gt;
                <a >
                    <img  >
                </a>
            &lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;&lt;/td&gt;
            &lt;td&gt;<b>Total</b>&lt;/td&gt;
            &lt;td align="right"&gt;R$ ${total}&lt;/td&gt;
        &lt;/tr&gt;
            &lt;/c:when&gt;
            &lt;c:otherwise&gt;
                &lt;tr&gt;
                    &lt;td align="center"&gt;<b>Não há produtos no carrinho.</b>&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/c:otherwise&gt;
        &lt;/c:choose&gt;
    &lt;/table&gt;                

Mudei meu struts-config

&lt;action name="ProdutoForm" parameter="acao" path="/vendas" scope="request" type="struts.action.ItensAction" validate="false"&gt;
        &lt;forward name="vendas" path="/ListaCarrinho.jsp"/&gt;        
    &lt;/action&gt;

e a action

[code]public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

    ProdutoForm pForm = (ProdutoForm)form;
    Integer IdProduto = new Integer(request.getParameter(pForm.getProdutoId()));
    HttpSession session = request.getSession(true);
    List&lt;ItemPedido&gt; lista =(List&lt;ItemPedido&gt;) session.getAttribute(SUCCESS);
    
    
    if(lista == null){
        lista = new ArrayList&lt;ItemPedido&gt;();
    }
    
    boolean existe = false;
    
    for(ItemPedido item : lista){
       if(item.getProduto().getId() == IdProduto){
           item.setQuantidade(item.getQuantidade()+1);
           //item.setTotal(item.getValorUnitario().multiply(new BigDecimal(item.getQuantidade())));
           item.setTotal(item.getValorUnitario().multiply(item.getValorUnitario(), new MathContext(item.getQuantidade())));
           
           existe = true;
       }
    }
    if(existe == false){
        ProdutoDao mProduto = new ProdutoDaoImpl();
        Produto bProduto = mProduto.getProduto(IdProduto);
        ItemPedido bean = new ItemPedido();
        bean.setId(IdProduto);
        bean.setQuantidade(1);
        bean.setProduto(bProduto);
        bean.setValorUnitario(bProduto.getValor());
        bean.setTotal(bProduto.getValor().multiply(new BigDecimal(bean.getQuantidade())));               

        lista.add(bean);
    }
   session.setAttribute(SUCCESS,lista);
   
   //calcula o valor da compra
   BigDecimal total = new BigDecimal(0);
   for(ItemPedido item: lista){
       total = total.add(item.getTotal());
   }
   session.setAttribute("total",total);
   
    return mapping.findForward(SUCCESS);
    
}

[/code]

Não sei o pq do erro…mas continua o msm erro!

:?
posta o stack novamente por favor…

chegou a colocar uns sysout no código para ver se o fluxo consegue entrar na tua Action?

t+

Desculpa a demora DianaPJ,

Segue o stack
25/06/2010 13:37:53 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet action threw exception
javax.servlet.ServletException: Request[/vendas] does not contain handler parameter named ‘acao’. This may be caused by whitespace in the label text.
at org.apache.struts.actions.DispatchAction.unspecified(DispatchAction.java:197)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:245)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)

Quanto ao sysout que vc perguntou, nao eu não coloquei. Onde coloco e o que coloco dentro dele?

Grata!