Action duas vezes

5 respostas
C

E ai, estou com um problema e se alguém puder me dar um força… agradeço

é o seguinte… eu tenho uma jsp com o seguinte trecho…

<html:link href="/mtt/efetuaVenda2.do?method=remover&c=${c.count-1}"> <html:img border="0" title="Remover" src="images/remover.jpg"/> </html:link>

este trecho esta dentro de um foreach. Como eu tenho um lista de produto, e neste caso, posso ter vários produto de mesmo ID (o controle fica em estoque no BD), então para poder remover um produto desta lista, eu passo por parâmetro a posição do produto na lista atraves da variavel c…

até aí blz… na action eu pego a lista e outros atributos, e consigo remover na boa pegando o indice pelo for…

for(int i = 0; i < listaProduto.size(); i++){ if(i == c ){ ProdutoTO p = (ProdutoTO) listaProduto.get(i); value = Money.subtrair(d, p.getPrecoVenda()); listaProduto.remove(i); break; } }

mas acontece que após fazer isso, qdo chega para dar um map.findForward, às vezes a action executa tudo de novo… e torna a pegar todos os parametros, e remove… aí eu ganho um “index out of range:” já que ele tenta remover um objeto de um indice que não possui mais nada…

Sinceramente não tenho ideia do que está acontecendo…

será que alguem pode dar uma força/

vlw
ABS

5 Respostas

Andre_Fonseca

Oi

você não pode colocar antes do for para garantir??

caso o método da sua action esteja sendo usada para mais de uma ação você pode fazer o seguinte

no seu formulário você coloca uma propriedade assim

ai então você pode setar o valor da propriedade via javascript parecido com isso

form submitFormulario() { form.operacao='removerListaProdutos'; form.submit(); }

ai no seu action você faz assim

if (mapping.getPath().equalsIgnoreCase("/removerListaProdutos")) { // remover lista de produtos } else { // apenas listar produtos }

não se esqueça de cadastrar a operação no struts-config.xml

abs

Mero_Aprendiz

Olá.
A solução que o André Fonseca propós pode solucionar o seu problema, mas o que eu vejo de problema é que o forward não deveria executar o método novamente.
Acredito que a melhor solução seja descobrir porque o Struts esta executando esse método novamente.
O que o seu map.findForward esta retornando?

[]'s

JL

C

André Fonseca,

este método é usado apenas para isso, remover um item desta lista… Como estou usando DispatchAction, basicamente este método pega apenas a lista q está na session + o indíce que vem por parâmetro…

eu já estou verificando o tamanho da lista antes do for…

:frowning:

C

Mero_Aprendiz,

Após pegar a lista na session, eu removo o item, faço alguns cálculos com a somatória dos valores dos produtos na lista,

e seta a mesma na session… então o método retorna:

return map.findForward("removeuItem");

que basicamente voltar para a mesma página:

<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"  %>
<%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<div class="label">
<c:choose>
	<c:when test="${empty user}">
		<bean:message key="logado.status.failure"/>
	</c:when>
	<c:otherwise>
		<bean:message key="logado.status.sucess"/> ${user.login}
	</c:otherwise>
</c:choose>
</div>
<div align="right"><html:link action="/efetuaLogout" styleClass="buttonsRed">
	<bean:message key="search.form.button.logout" />
</html:link></div>


<LINK REL=STYLESHEET HREF="css/default.css" TYPE="text/css">
<LINK REL=STYLESHEET HREF="css/form.css" TYPE="text/css">
<LINK REL=STYLESHEET HREF="css/grid.css" TYPE="text/css">
<script src="js/funcoes.js" language="JavaScript"></script>

<!-- BEGIN ABA CLIENT -->
<jsp:include flush="true" page="abas/abaVender.jsp"></jsp:include>
<!-- END ABA CLIENT -->

<body onload="limpaCampo()">
<script language="Javascript">
function limpaCampo(){
	document.getElementById("cod").value = '';
	document.getElementById("cod").focus();
}
</script>

<div class="subTitle">Venda</div>

<!-- BEGIN ERROR MESSAGE -->
<jsp:include flush="true" page="erro/messages.jsp"></jsp:include>
<!-- END ERROR MESSAGE -->

<div id="divMsgAlert">
  <table border="0" cellpadding="1" cellspacing="0" class="tableMenssage">
    <tr>
      <td class="tableMenssageInternal">Efetuar Venda!</td>
    </tr>
  </table>
</div>

<div id="conteudo">

<html:html>
<table width="250" align="center">
	<html:form action="/efetuaVenda2.do?method=busca" >

	
	<td class="label">CODIGO: </td>
			<td><html:text name="SearchFormBean" property="codNumber" maxlength="6" size="21" styleId="cod" styleClass="form" onkeypress="IsNum(this,event);"></html:text></td>
	<table align="center">
		<tr>
			<td>
				<div class="buttons" align="center">
					<html:submit styleClass="buttonsGer" >
						OK
					</html:submit>
				</div>
				</td>
		</tr> 
	</table>
	  
</html:form>
</table>

<div class="gridTop">Resultado da busca</div>
<div id="grid" align="center">
		<table width="98%" align="center">
			<tr>
			   <td width="13%" align="center" class="rowTop">NOME</td>
			   <td width="13%" align="center" class="rowTop">TAMANHO</td>
			   <td width="13%" align="center" class="rowTop">MARCA</td>
			   <td width="13%" align="center" class="rowTop">PREÇO</td>
			   <td width="13%" align="center" class="rowTop">REMOVER</td>
			   <td width="13%" align="center" class="rowTop">DESCONTO NO ITEM</td>
			</tr>
				
			<c:forEach var="listaProduto" items="${listaProduto}" varStatus="c" >
				
				<tr class="grayRow" onMouseOver="amarela(this)" onMouseOut="voltaCorCinza(this)" >
					<td width="13%" align="center">
						${listaProduto.nome}
					 </td>
					 <td width="13%" align="center">
						${listaProduto.tamanho}
					 </td>
					 <td width="13%" align="center">
						${listaProduto.marca}
					 </td>
					 <td width="13%" align="center">
						${listaProduto.precoVenda}
					 </td>
					 <td width="5%" align="center">
					 <html:link href="/loja/efetuaVenda2.do?method=remover&c=${c.count-1}">
							<html:img border="0" title="Remover" src="images/remover.jpg"/>
						</html:link>
					 </td>
					 <td width="5%" align="center">
						<html:link href="/loja/descontoItem.do?id=${listaProduto.id}" >
							<html:img border="0" title="Desconto por Item" src="images/editar.jpg"/>
						</html:link>
					 </td>
				</tr>
			</c:forEach>
		</table>
		<table width="98%" align="center">
			<tr class="rowTop">
				<td align="center">
					TOTAL: ${total}
				</td>
			</tr>
		</table>
		
		<!-- BOTAO VENDER -->
<div class="topGridLine">
	<table>
		<tr>
			<td><html:link action="/efetuaVenda2.do?method=opcoesDeVenda" styleClass="buttonsInt">EFETIVAR VENDA</html:link></td>
		</tr>
	</table>
	
	<table>
			<tr>
				<td><html:link action="/efetuaVenda2.do?method=desconto" styleClass="buttonsInt">DESCONTO</html:link></td>
			</tr>
		</table>
	
</div>
</div>
</html:html>

Então não sei pq o map.Find… chama novamente este método…

algo que reparei, mas como não entendo muito, é que… conforme são adicionados produtos nesta lista… em dado momento o tomcat cria um daemon thread (8080: 2)… por exemplo…

qdo faço o debug… consigo remover alguns itens de boa… e neste caso estou preso ao daemon thread(8080: 1)… mas qdo a action reinicia de novo… o método cai em daemon thread (8080: 2)

Como disse, não sei bem como funciona essas threads em background, mas é isso que está acontecendo…

vlww

C

Entao… tentei a solução acima, mas ta na msma…

ninguem??

Criado 20 de fevereiro de 2009
Ultima resposta 23 de fev. de 2009
Respostas 5
Participantes 3