Passar Indice de Array para Action

3 respostas
desk

Olá pessoal, é o seguinte. Estou fazendo 1 sistema de carrinho de compras e estou guardando o carrinho(array) na sessão. Agora estou tentando fazer a parte para deletar o produto do carrinho.

O que eu queria fazer é o seguinte, assim que o cara clicar no link para deletar o produto, eu passaria o tal índice que o produto está no array para a action e um método o deletaria, pelo que vi é a maneira mais fácil de se fazer isso, porém estou tendo problemas na hora de passar o tal índice do produto para a action segue o código:
org.apache.jasper.JasperException: An exception occurred processing JSP page /carrinho-compras.jsp at line 51

48: 		<tr>
49: 			<td> ${item.livro.nome} </td>
50: 			<td> <center>${item.quantidade}</center> </td>
51: 			<td> <a href="removeItem?cod=${item.lenght}"> X </a> </td>
<table width="500px">
	<tr>
		<th> Nome </th>
		<th> Quantidade </th>
		<th> Preço </th>
		<th> Excluir </th>
		<th> TOTAL </th>
	</tr>
	<c:forEach var="item" items="${carrinhoCompras.itens}">
		<tr>
			<td> ${item.livro.nome} </td>
			<td> <center>${item.quantidade}</center> </td>
			<td> <a href="removeItem?cod=${item.lenght}"> X </a> </td>
			<td> 
				<fmt:setLocale value="pt_BR"/>
				<center> R$: <fmt:formatNumber value="${item.livro.preco}" minFractionDigits="2"/> </center>
			</td>
	</c:forEach>
			<td> 
				<font color="red">
					<center> R$: <fmt:formatNumber value="${carrinhoCompras.total}" minFractionDigits="2" /> </center> 
				</font>
			</td>
		</tr>
</table>
public class RemoveItemAction {
	private int cod ;
	
	@Action(value="removeItem", results={
			@Result(name="ok", location="/carrinho-compras.jsp")
	})
	public String execute() {
		Carrinho carro = (Carrinho) ActionContext.getContext().getSession().get("carrinhoCompras") ;
		carro.removeLivro(cod) ;
		return "ok" ;
	}
	
	public int getCod() {
		return cod;
	}

}
public class Carrinho {
	private List<ItemCarrinho> itens = new ArrayList<ItemCarrinho>();
	private Double total = 0.0 ;
	
	public void adicionaLivro(ItemCarrinho l) {
		this.itens.add(l) ;
		this.total = total + (l.getLivro().getPreco() * l.getQuantidade()) ;
	}
	public void removeLivro(int l) {
		this.total = total - itens.get(l).getLivro().getPreco() ;
		this.itens.remove(l) ;
	}

	// getters and setters
}

Grato.

3 Respostas

desk

Ninguem?

von.juliano

Não acha que é melhor, ao invés de usar o indice do array usar o id do item? Assim você só precisa localizar ele na lista e removê-lo, assim vai diminuir o risco de ter problemas com o indice do array/lista.

Flw! :thumbup:

desk
Como eu faria para deletar assim? Pelo que eu saiba eu deveria passar o Índice em que o produto está para assim ser apagado, mas enfim.. tentei aqui deletar pelo id mas não acontece nada, segue o código:
<table width="480px">
	<tr>
		<th> Nome </th>
		<th> Quantidade </th>
		<th> Excluir </th>
		<th> Preço </th>
		<th> TOTAL </th>
	</tr>
	<c:forEach var="item" items="${carrinhoCompras.itens}">
		<tr>
			<td> ${item.livro.nome} </td>
			<td> <center>${item.quantidade}</center> </td>
			<td> <center> <a href="removeItem?item.livro.id=${item.livro.id}"> X </a> </center> </td>
			<td> 
				<fmt:setLocale value="pt_BR"/>
				<center> R$: <fmt:formatNumber value="${item.livro.preco}" minFractionDigits="2"/> </center>
			</td>
	</c:forEach>
			<c:if test="${carrinhoCompras.itens != null}">
			<td> 
				<font color="red">
					<center> R$: <fmt:formatNumber value="${carrinhoCompras.total}" minFractionDigits="2" /> </center> 
				</font>
			</td>
			</c:if>
		</tr>
</table>
public class RemoveItemAction {
	private ItemCarrinho item ;
	
	@Action(value="removeItem", results={
			@Result(name="ok", location="/carrinho-compras.jsp"),
			@Result(name="removido", location="/carrinho-compras.jsp")
	})
	public String execute() {
		Carrinho carro = (Carrinho) ActionContext.getContext().getSession().get("carrinhoCompras") ;
         int posicao = carro.getItens().indexOf(item) ;
		carro.removeLivro(posicao) ;
		return "ok" ;
	}
	public String removerTudo() {
		Carrinho carro = (Carrinho) ActionContext.getContext().getSession().remove("carrinhoCompras") ;
		return "removido" ;
	}
	
	public void setItem(ItemCarrinho item) {
		this.item = item;
	}
	public ItemCarrinho getItem() {
		return item;
	}

}
public class Carrinho {
	private List<ItemCarrinho> itens = new ArrayList<ItemCarrinho>();
	private Double total = 0.0 ;
	
	public void adicionaLivro(ItemCarrinho l) {
		this.itens.add(l) ;
		this.total = total + (l.getLivro().getPreco() * l.getQuantidade()) ;
	}
	public void removeLivro(int l) {
		this.itens.remove(l) ;
	}
	
	public Double getTotal() {
		return total;
	}
	public void setTotal(Double total) {
		this.total = total;
	}
	public List<ItemCarrinho> getItens() {
		return itens;
	}
	public void setItens(List<ItemCarrinho> itens) {
		this.itens = itens;
	}

}
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.ArrayIndexOutOfBoundsException: -1
	java.util.ArrayList.remove(ArrayList.java:390)
	br.com.ibooker.modelo.Carrinho.removeLivro(Carrinho.java:17)
	br.com.ibooker.action.RemoveItemAction.execute(RemoveItemAction.java:22)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
	org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
Criado 28 de julho de 2010
Ultima resposta 7 de ago. de 2010
Respostas 3
Participantes 2