dúvida no c:forEach [RESOLVIDO]

Acho que eu to fazendo algo errado que não estou conseguindo enxergar, toda vez que faço um <c:forEach /> e ganho uma linda Exception na view, segue meu código:

Action no Struts 1.x:

private String performListar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
	ImovelBusiness imovelBusiness = new ImovelBusiness();
	List<Imovel> imoveis = imovelBusiness.getAllImovel();
	
	request.setAttribute("imoveis", imoveis); // vou trabalhar com este objeto.
	
	return Constants.SUCCESS;
		
}

View (Aonde eu ganho exception):

<c:forEach var="imovel" items="${imoveis}">
	<c:out value="${imovel.inquilino}" />
</c:forEach>

meu bean:

@RemoteProxy
@DataTransferObject
@Entity(name="imovel")
public class Imovel implements Serializable {
	
	@RemoteProperty
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id", nullable=false, length=11)
	private int id;
	
	@RemoteProperty
	@Column(name="proprietario", length=100)
	private String proprietario;
	
	@RemoteProperty
	@Column(name="inquilino", length=100)
	private String inquilino;
	
	@RemoteProperty
	@Column(name="pasta", length=3)
	private Integer pasta;
	
	@RemoteProperty
	@Column(name="vencimento", length=2)
	private Integer vencimento;
	
	@RemoteProperty
	@Column(name="anotacao", length=100)
	private String anotacao;
	
	@RemoteProperty
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data_de_cadastro")
	private Date dataDeCadastro;
	
	@RemoteProperty
	public String getAnotacao() {
		return anotacao;
	}

	public void setAnotacao(String anotacao) {
		this.anotacao = anotacao;
	}
	
	@RemoteProperty
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	@RemoteProperty
	public String getProprietario() {
		return proprietario;
	}

	public void setProprietario(String proprietario) {
		this.proprietario = proprietario;
	}
	
	@RemoteProperty
	public String getInquilino() {
		return inquilino;
	}

	public void setInquilino(String inquilino) {
		this.inquilino = inquilino;
	}
	
	@RemoteProperty
	public Integer getPasta() {
		return pasta;
	}

	public void setPasta(int pasta) {
		this.pasta = pasta;
	}
	
	@RemoteProperty
	public Integer getVencimento() {
		return vencimento;
	}

	public void setVencimento(int vencimento) {
		this.vencimento = vencimento;
	}
	
	@RemoteProperty
	public Date getDataDeCadastro() {
		return dataDeCadastro;
	}

	public void setDataDeCadastro(Date dataDeCadastro) {
		this.dataDeCadastro = dataDeCadastro;
	}
	
}

Stacktrace:

SEVERE: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property 'inquilino' not found on type java.lang.String
	at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:193)
	at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:170)
	at javax.el.BeanELResolver.property(BeanELResolver.java:279)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:60)
	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.relacao.index_jsp._jspx_meth_c_005fforEach_005f0(index_jsp.java:189)
	at org.apache.jsp.relacao.index_jsp._jspx_meth_html_005fhtml_005f0(index_jsp.java:115)
	at org.apache.jsp.relacao.index_jsp._jspService(index_jsp.java:77)
	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.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
	at org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
	at org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
	at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	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: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)

EDIT*:

limpei a lista, e ao inves de mandar uma lista cheia, mandei uma lista apenas com 2 objetos.
dai, a exception mudou para:

javax.servlet.ServletException: org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
	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:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.apache.jasper.JasperException: org.apache.jasper.JasperException: Unable to load class for JSP
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:156)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
	org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
	org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	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:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

... continua

Tente usar apenas
<c:out value="${imovel}" />
e veja se aparece algo como “Inquilino@38384” no JSP

[quote=jyoshiriro]Tente usar apenas
<c:out value="${imovel}" />
e veja se aparece algo como “Inquilino@38384” no JSP[/quote]

Não resolveu, mas seguindo a sua ideia eu fiz no action:

request.setAttribute("teste", "teste");

e na view:

<c:out value="${teste}" />

e ganhei outra exception:

exception

javax.servlet.ServletException: org.apache.jasper.JasperException: /relacao/index.jsp(17,2) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
	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:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.apache.jasper.JasperException: /relacao/index.jsp(17,2) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
	org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1213)
	org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:852)

engraçado que essa colection funcionava normalmente com displayTag. Todavia, eu to achando que isso é problema nas taglib do jsp, pois se eu fazer:

<c:out value="Minha Frase Escrita aqui no hardcode!" />

ele funciona normalmente, pode confirmar apenas para me deixar mais seguro ? :stuck_out_tongue:

Tenta botar só ${imovel}, fora da tag <c:out> mesmo.

vc nao precisa utilizar c:out dentro do c:forEach

faça assim:


<c:forEach var="imovel" items="${imoveis}">  
     ${imovel.inquilino} 
</c:forEach>  

que “traduzindo” a tag ficaria assim em uma pagina:


String[] items = (String[]) request.getAttribute(?imoveis?);
for (int i = 0; i < items.length; i++) {
String imovel= items[i];
out.println(imovel.getInquilino()); //out do response
}

Ola pessoal, obrigado pela ajuda de todos. Acabei achando a resposta no google depois de perder umas 2 noites.
http://answers.google.com/answers/threadview/id/373340.html

como eu não sei se a página vai ficar la pra sempre, e vi que existe uma enxurrada de gente na internet com o mesmo problema, vou deixar cotado aqui o post original da pessoa:

resumidamente, eu acabei ficando sem entender o porquê desse mínimo detalhe, coisas da sun … :frowning:

como eu falei acima nao funcionou?

De fato tem muitas pessoas com dúvida na impressão do ForEach do JSTL.

A solução dita pelo amigo ai funciona mesmo.

é só trocar a taglib assim:

De:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

Para:

<%@taglib uri="http://java.sun.com/jsp/jstl/core_rt" prefix="c" %> 

Aqui no meu caso resolveu.

Abraço!