Tag <s:iterator do Struts 2 não itera objeto no request?>

Galera boa tarde.

Estou usando o Struts 2 e aconteceu o seguinte problema comigo, quando tenho uma lista no request a tag de iterator não consegue iterar, segue parte do código…

Action:

public void search() { List listBean = new SimplePojoService().get(getSimpleBean()); if(listBean != null && !listBean.isEmpty()){ HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST); request.setAttribute("simpleList", listBean); } }E no jsp fiz assim:

<s:iterator value="simpleList"> <tr> <td><s:property value="id"/></td> <td><s:property value="nome"/></td> </tr> </s:iterator>Pra fazer funcionar tive q criar um método “getSimpleList” que retorna a lista, o ruim que pra todos os meus actions teria q criar esse método de retorno, alguém sabe como usar a tag iterator pegando a lista direto do request?? Engraçado que no Struts 1 isso funcionava normalmente…

Valew.

Sem mais, Rodrigo.

no struts2 você tem que utilizar métedos get/set para colocar esses elementos no seu jsp.

por exemplo, você tem que declarar os métodos

public void setListBean(List&lt;listBean&gt; list){   
     this.listBean = list; }

public List&lt;listBean&gt; getListBean(){return this.listBean;}

Através destes métodos o struts2 vai tornar estes objetos acessíveis para você no jsp.

Mas entaum quer dizer que não tem como pegar um List no escopo do request pra ele iterar?? :shock:

E eu q estava até agora pouco elogiando o Struts 2… hehe

Valew obrigado pela resposta.

[quote=rodrigo_corinthians]Mas entaum quer dizer que não tem como pegar um List no escopo do request pra ele iterar?? :shock:

E eu q estava até agora pouco elogiando o Struts 2… hehe

Valew obrigado pela resposta.[/quote]

Supondo que o seu objeto no request chama list, tenta o seguinte

<s:set name="list" scope="request" value="list" />

Acredito que irá funcionar (na verdade eu nao testei isso no Struts 2 ainda, mas no Webwork funcionava)

quando exectuar o método setListBean, automaticamente a sua variável listBean estará disponível no escopo do request pra você fazer o iterate.

Dentro o execute de sua action você faz uma chama a este método (setListBean) e, quando o struts2 fizer o redirect para o result definido no struts.xml, ele vai passar o seu listBean junto, possibilitando o iterate.

entendeu?

ps.: a variável listBean tem de ser global.

Olá ManchesteR, testei o seu código aqui e não funfou.

Olá lmprates, entaum entendi perfeitamente o que vc me disse mas o que eu pretendia era não ter esses métodos get/set e sim pegar o List q estava no request, pelo visto acho q não tem como fazer isso no Struts 2…

Valew galera pelas respostas.

[quote=rodrigo_corinthians]Olá ManchesteR, testei o seu código aqui e não funfou.

Olá lmprates, entaum entendi perfeitamente o que vc me disse mas o que eu pretendia era não ter esses métodos get/set e sim pegar o List q estava no request, pelo visto acho q não tem como fazer isso no Struts 2…

Valew galera pelas respostas.[/quote]

entendi…to mandando um exemplo de itarator no struts2, talvez ajude

<s:iterator value="produtos" status="stat">
<tr>
	<td>
		<s:property value="produtos[#stat.index].id"/>
	</td>
	<td>
		<s:property value="produtos[#stat.index].nome"/>
	</td>
	<td>
		<a href="produtoaltera.action?produto.id=<s:property value="produtos[#stat.index].id"/>">Editar</a>
	</td>
	<td>
		<a href="produtoexclui.action?produto.id=<s:property value="produtos[#stat.index].id"/>">Excluir</a>
	</td>
	<td>
		
	</td>
</tr>
</s:iterator>

aqui tem a referência completa das tags do struts
http://struts.apache.org/2.0.8/docs/tag-reference.html

Segue um exemplo de como eu trabalho com request e session…

Setando um atributo…

	public String listCart() {
		ActionContext context = ActionContext.getContext();
		products = (List<Product>) context.getSession().get("cart");
		return "success";
	}

Lendo o valor no jsp

<% if (request.getSession().getAttribute("cart") == null) out.print("0"); else { ArrayList listProducts = (ArrayList)session.getAttribute("cart"); out.print(listProducts.size()); }%>

Lendo um valor em um iterator…

<s:iterator value="products"> <tr> <td> <s:textfield name="quantity" cssClass="textfield" size="10" value="1" theme="simple" onchange="recalculate();" /> </td> <td><s:textfield name="name" cssClass="textfield" size="70" theme="simple" /></td> <td><s:textfield name="price" cssClass="textfield" size="30" theme="simple" onchange="recalculate();" /></td> <td><s:textfield value="0" name="productTotal" cssClass="textfield" size="30" theme="simple" readonly="true" /></td> </tr> </s:iterator>

espero ter ajudo

Abraços

Rafael Oliveira