Ajuda JSF

Olá pessoal, gostaria de expor um problema a vcs. Esse problema é conhecido mas a solução que encontrei não resolveu, por isso escrevo aqui esse tópico.

<h:dataTable border="1" value="#{loginSistema.menuUsuario.itens}" id="tabsist" var="item">
			<h:column>
				<h:commandLink action="#{carregarSistema.execute}">
					<f:setPropertyActionListener target="#{carregarSistema.codigo}" value="#{item.codigo}"/>
					<h:outputText value="#{item.nome}"/>
				</h:commandLink>				
			</h:column>
		</h:dataTable>

Por causa do atributo var no DataTable, ocorre a seguinte exceção:

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 24 in the jsp file: /jsp/sca/listasistemas.jsp
The method setVar(String) in the type DataTableTag is not applicable for the arguments (JspValueExpression)
21: 					</tr>
22: 				</c:forEach>			
23: 			</table>
24: 		<h:dataTable border="1" value="#{loginSistema.menuUsuario.itens}" id="tabsist" var="item">
25: 			<h:column>
26: 				<h:commandLink action="#{carregarSistema.execute}">
27: 					<f:setPropertyActionListener target="#{carregarSistema.codigo}" value="#{item.codigo}"/>

Então, eu parti pra uma solução retirando o atributo var, e fiz um teste, colocando um link e implementando um actionListener, dessa forma:

<h:commandLink action="#{carregarSistema.execute}" actionListener="eventoListener">
			<h:outputText value="Atualizar a página atual"></h:outputText>
		</h:commandLink>

Olha o código ao actionListener:

public void eventoListener (ActionEvent event) {
		Login loginAtual = (Login) this.recuperaParamSession("loginSistema");
		Menu menuUsuario = (Menu) loginAtual.getMenuUsuario();
		UIComponent component = event.getComponent().findComponent("tabsist");
		if (component != null) {
			HashMap atributos = (HashMap) component.getAttributes();			
			atributos.put("value", menuUsuario.getItens());
			atributos.put("var", "item");			
		}
	}

Nesse teste, quando eu clico no link de atualização da página, a listagem do DataTable aparece normalmente. Alguem sabe uma forma de resolver esse problema do DataTable sem precisar de um actionlistener? Tô usando Apache Tomcat 6.0.14, e JSF 1.2

Encontrei uma abordagem alternativa pra resolver esse problema… é passando o método carregarSistema.execute como parâmetro de request. Isso quer dizer que a tag c:forEach do JSTL é bem mais flexivel de se trabalhar quando se trata de tabelas. Ah sim , pra que isso se tornasse possível na tag f:view eu coloquei um método beforePhase para dar sequencia no processamento do JSF.

Wagner

Mais uma vez retificando o problema. Embora muitos por aí já tenham apontado várias soluções para o problema da tag <h:DataTable/> do JSF, nenhuma delas resolveu o problema. Foi aí que de tanto tentar , encontrei mais uma:

Problema: No momento de renderização, a tabela não recebe a coleção de objetos para iteração nem declara o valor de cada linha. Assim é necessário fazer isso manualmente, antes de completar a carga da página.

Solução:

na tag <f:view> acrescentei o parâmetro beforePhase da seguinte forma:

&lt;f&#58;view beforePhase=&quot;#&#123;carregarSistema.ajustaListagemSistemas&#125;&quot;&gt;

e declaro esse método no ManagedBean récem carregado:

public class CarregarSistema extends AcaoAdapter implements Acao &#123;
...
public void ajustaListagemSistemas&#40;PhaseEvent event&#41;&#123;
         Login loginAtual = &#40;Login&#41; FacesContext.
		getCurrentInstance&#40;&#41;.
		getExternalContext&#40;&#41;.
		getSessionMap&#40;&#41;.get&#40;&quot;loginSistema&quot;&#41;;
		Menu menuSistema = loginAtual.getMenuUsuario&#40;&#41;;
         //encontra o DataTable
         UIData tabela = &#40;UIData&#41; event.getFacesContext&#40;&#41;.getViewRoot&#40;&#41;.findComponent&#40;&quot;form0&#58;tabelasistemas&quot;&#41;;
        //atualiza os valores dos parâmetros
        tabela.getAttributes&#40;&#41;.put&#40;&quot;values&quot;, menuSistema.getItens&#40;&#41;&#41;;
        tabela.getAttributes&#40;&#41;.put&#40;&quot;var&quot;, &quot;item&quot;&#41;;
&#125;
&#125;

Fica aí portanto registrado a quem interessar possa.

Wagner
(“Eita Deus de mistério!!!”)[/code]