[RESOLVIDO] Itens do Foreach repetidos

24 respostas
M

Boa tarde pessoal,

tenho um list no qual faço um foreach e ele retorna os itens repetidos.

JSP:
<c:set var="servico" scope="session" value=""/>
					<c:set var="i" scope="session" value="1"/>
					<c:forEach var="posicoes" items="${posicaoList}" >
						<tr>
							<td>${posicoes.codServico}</td>
							<td>${posicoes.desServico}</td>
							
							<c:if test="${servico != posicoes.codServico}">
								<c:set var="servico" scope="session" value="${posicoes.codServico}"/>
								<c:set var="i" scope="session" value="0"/>
							</c:if>
							<c:set var="i" scope="session" value="${i+1}"/>
							<td>${i}</td>
							<td>${posicoes.sequencia}</td>
							<td>${posicoes.cavalo}</td>
						</tr>
						<br/>
					</c:forEach>
					
					<c:remove var="servico" scope="session"/>
					<c:remove var="i" scope="session"/>

Se alguem souber e puder da uma forcinha...

Obrigada...

24 Respostas

M

O interessante é que imprime a quantidade certa de registro, porem as descrições são repetidas.

J

Olá,

Bem, o o “foreach” leva em consideração se um objeto é diferente do outro pelo método “equals”. Logo, deve ter alguma coisa que difere teus objetos sem que você queira. O que tem nessa coleção “posicaoList”?

J

Agora que vi teu outro post.

Nesse caso o JSTL pode estar se confundindo pelo nome de sua variável.

Existe algum atributo de requisição chamado “posicoes”?

M

posicoes não, mas poderia ser em outro lugar?

J

Então o problema deve estar em como você alimenta essa coleção. Poderia mandar o código onde você faz isso?

M

Vamos lá

public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		

		ExternaFacade externalFacade = new ExternaFacade(getI18N(request));
		Pagina pagina = getPagina(request);
	
		Posicao posicao = new Posicao();	
		
		request.setAttribute(PAGINA, pagina);
		request.setAttribute("posicaoList", externalFacade.listarPosicao(posicao, pagina));
		request.setAttribute(DECORADORES, getDecoradores(getI18N(request)));
		
		return mapping.findForward("listarPosicao");
	}
public List<Posicao> listarPosicao(Posicao obj, Pagina pagina) throws Exception {		
		IDAO<Posicao> dao = daoFactory.getPosicaoDAO();
		return dao.listar(obj, pagina);
	}
@SuppressWarnings("unchecked")
	public final List<T> listar(T obj, Pagina pagina) throws Exception {

		try {
			Session session = hibernateUtil.currentSession();
			Criteria q = session.createCriteria(obj.getClass());
			
			ProjectionList pj = Projections.projectionList();
			setProjections(obj, pj);
			if(pj.getLength() > 0) q.setProjection(pj);
			
			if(pagina != null){
				q.setMaxResults(pagina.getQuantidadeRegistroPagina());
				q.setFirstResult( (pagina.getPaginaAtual()-1) * pagina.getQuantidadeRegistroPagina() );
			}
			
			setAlias(obj, q);
			setParametrosListagem(obj, q);
			setOrdenacao(obj, q);
			
			return q.list();
		} finally {
			hibernateUtil.closeSession();
		}
		
	}

Não dsei se você vai entender, mas o processo é esse.

J

Ah, e uma dica:
Não precisa criar uma variável e por em escopo de sessão para fazer a contagem do item atual.

Mude a tag forEach para:

<c:forEach var="posicoes" items="${posicaoList}" varStatus="st">
E para saber a contagem atual:
${st.index}

E para saber a contagem total:
${st.count}

J

Rode sua aplicação em modo debug e verifique como a consulta está retornando do banco. Porque parece-me tudo ok.

M

rsrsrsrrss… Pra mim tb parece estar ok!!! Já quebrei a cabeça aqui.

J

Então. Na minha opinião o erro só pode estar na consulta. Acho que o JSTL está exibindo o que veio mesmo de suas consulta com Hibernate. Então verifique se sua consulta traz o que você acha que ela traz, entendeu? Bem, eu faria isso :wink:

M

O select que o hibernate gera é:

select
            this_.codser as codser40_0_,
            this_.sequen as sequen40_0_,
            this_.codcav as codcav40_0_,
            this_1_.descri as descri41_0_ 
        from
            vea016 this_,
            vea015 this_1_ 
        where
            this_.codser=this_1_.codigo 
            and this_.codser like ? 
        order by
            this_.codser asc,
            this_.sequen asc,
            this_.codcav asc

E eu rodei essa sql no banco e retornou os dados certinhos.

J

Amigo, desculpe a insistência, mas rode em modo debug e veja como sua coleção fica. Não confie 100% nesse tradutor SQL do Hibernate…
O JSTL não pode estar errando numa coleção tão simples.

Ainda no JSP, faça um teste assim: ao inves de “posicoes”, chame sua variável de iteração apenas de “p” e veja se muda alguma coisa.

M

mudei para p e continua a mesma coisa. ai meu Deus.

J

Insisto: depura que você vai achar o erro…

Bota um breakpoint logo após essa linha:

request.setAttribute("posicaoList", externalFacade.listarPosicao(posicao, pagina));
e manda executar o seguinte código (watch) :

request.getAttribute("posicaoList")

Na Coleção que vai aparecer, vá na navegando em seu conteúdo e veja se ele está ok.

M

O que eu olho nele no getAtribute?

Eu dei um “syso” e retorna a lista, porem não dá pra ver o que tem nela.

M

Bom eu tô saindo agora, mas amanhã eu continuo olhando isso… Se você puder me ajudar eu vou ficar muito feliz… rsrsrsr
Obrigada!

J

Amigo, isso se fazer “syso” é uma tremenda POG… Use o modo debug e fique 100000000000000000000000000000 de passos a frente de quem usa “syso” pra depurar erros no código.

J

Se quiser, te ensino a usar o modo debug no netbeans e no eclipse (imagino que você use um desses 2, né?)

M

No modo debug na variavel request/atributes eu tenho isso a list.

Como faço para ver o conteúdo?

M

Muito bem, eu consegui ver no modo debug, realmente os itens do banco não estão vindo corretamente.
Agora tô mais enrolada ainda.
o que eu faço??? rsrsrsrsr

J

Calma… agora é você criar uma classe com Main ou uma classe de teste unitário para ir testando e reescrevendo essa sua consulta pelo Hibernate até que retorne a tupla que você quer. É bem mais rápido do que ficar levantando sua aplicação WEB para testar isso.

M

Consegui resolver esse problema.

Apesar da query funcionar quando rodo ela no banco, no hibernate é necessário agrupar.
Então acrescentei o Projections.groupProperty na Criteria.

Mas surgiu outro problema, o código está assim:

JSP

<c:set var="servico" scope="session" value=""/>
					<c:set var="i" scope="session" value="1"/>
					<c:forEach var="posic" items="${posicaoList}">
						<tr>
								<td>${posic.id}</td>
								<td>${posic.desServico}</td>
								
								
								
								<td>${i}</td>
								<td>${posic.sequencia}</td>
								<td>${posic.cavalo}</td>
							</tr>
							<br/>
						<c:if test="${servico !=posic.id}">
							<c:set var="servico" scope="session" value="${posic.id}"/>
							<c:set var="i" scope="session" value="0"/>
						</c:if>
						<c:set var="i" scope="session" value="${i+1}"/>
					</c:forEach>
					
					<c:remove var="servico" scope="session"/>
					<c:remove var="i" scope="session"/>

Agora da o erro abaixo:

16:14:31,000 ERROR InsertTag:920 - ServletException in '/paginas/emitirPosicaoFila/listar_posicao_fila.jsp': For input string: "id"
org.apache.jasper.JasperException: An exception occurred processing JSP page /paginas/emitirPosicaoFila/listar_posicao_fila.jsp at line 34

31: 					<c:set var="i" scope="session" value="1"/>
32: 					<c:forEach var="posic" items="${posicaoList}">
33: 						<tr>
34: 								<td>${posic.id}</td>
35: 								<td>${posic.desServico}</td>
36: 								
37: 								


Stacktrace:
	at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
	at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
	at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:621)
	at org.apache.struts.tiles.TilesUtilImpl.doInclude(TilesUtilImpl.java:101)
	at org.apache.struts.tiles.TilesUtil.doInclude(TilesUtil.java:137)
	at org.apache.struts.taglib.tiles.InsertTag.doInclude(InsertTag.java:758)
	at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:890)
	at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:460)
	at org.apache.jsp.paginas.layouts.applicationLayout_jsp._jspx_meth_tiles_005fget_005f2(applicationLayout_jsp.java:1102)
	at org.apache.jsp.paginas.layouts.applicationLayout_jsp._jspService(applicationLayout_jsp.java:850)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1056)
	at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:261)
	at org.apache.struts.tiles.TilesRequestProcessor.processTilesDefinition(TilesRequestProcessor.java:237)
	at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:300)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:231)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	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:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	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:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NumberFormatException: For input string: "id"
	at java.lang.NumberFormatException.forInputString(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at java.lang.Integer.parseInt(Unknown Source)
	at javax.el.ArrayELResolver.coerce(ArrayELResolver.java:153)
	at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:45)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:935)
	at org.apache.jsp.paginas.emitirPosicaoFila.listar_005fposicao_005ffila_jsp._jspx_meth_c_005fforEach_005f0(listar_005fposicao_005ffila_jsp.java:265)
	at org.apache.jsp.paginas.emitirPosicaoFila.listar_005fposicao_005ffila_jsp._jspx_meth_html_005fform_005f0(listar_005fposicao_005ffila_jsp.java:170)
	at org.apache.jsp.paginas.emitirPosicaoFila.listar_005fposicao_005ffila_jsp._jspService(listar_005fposicao_005ffila_jsp.java:114)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
	... 50 more

Pode me ajudar?

M

Olha, tô começando a pegar esse trem… rsrsrsrs

Resolvido, é porque os itens da lista vem com indice de 0 à 3 e não pelo nome como era antes de fazer o group by na query.

Valeu mesmo pela ajuda!!!

J

Dentro do seu laço, ${posic.id} é um número ou um texto?

[editado] blz então. precisando, estamos por aqui.

Criado 15 de fevereiro de 2011
Ultima resposta 16 de fev. de 2011
Respostas 24
Participantes 2