JSF Iniciante - Dúvida: como usar o ListDataModel e me livrar da minha gambiarra?

1 resposta
kicolobo

Olá, sou iniciante no uso do JSF e estou com a seguinte dúvida: há situações nas quais você precisa expor o resultado de uma pesquisa para o usuario. Cada uma das linhas contidas no resultado desta pesquisa representa um bean cujos detalhes podemos querer expor posteriormente quando o usuário por exemplo clica sobre o mesmo.

Para tal, são necessárias portanto duas páginas JSP. Uma que expõe o resultado da pesquisa e outra aonde é possível visualizar os detalhes de cada item da mesma.

Estou procedendo da seguinte forma: populo um dataTable com os dados da resposta, tal como (irei omitir os cabeçalhos e expor apenas os dados para simplificar) abaixo:

<h:tableData value="#{bean.resultado}" var="item">
     <h:column>
          <h:outputText value="#{item.descricao}"/>
      </h:column>
      <h:column>
           <!-- Aqui entra o início da minha gambiarra -->
            <h:outputLink value="detalhe.jsp?idItem=#{item.id}">
                   <h:outputText value="#{item.descricao2}"/>
             </h:outputLink>
       </h:column>
  </h:tableData>

Na página referenciada (detalhe.jsp), no início da mesma coloco um scriptlet que carrega do banco de dados o objeto item que possui o id passado como parâmetro e em seguida o armazeno na sessão ou na requisição, dependendo do caso.

Como podem ver, trata-se de uma solução digna do prêmio Gambiarra 2007. Minha dúvida portanto é a seguinte: sei que no Faces há um objeto chamado ListDataModel que serve justamente para lidarmos com este tipo de situação, mas encontrei pouquíssima documentação a seu respeito (basicamente, apenas o Javadoc). Como devo usá-lo? É realmente este o tipo de abordagem que devo tomar? Qual a maneira menos gambiarresca de proceder em situações tais como esta que acabo de descrever? Como devo proceder para me livrar de uma vez por todas destes malditos scriptlets?

1 Resposta

D

Olá amigo na verdade vc está fazendo trabalho demais o componente <h:dataTable já passa automaticamente (via request) o objeto selecionado. experimente o sequinte codigo:

><h:tableData value="#{bean.resultado}" var=“item”>

<h:column>

<h:outputText value="#{item.descricao}"/>

</h:column>

<h:column>

<h:commandLink action="#{bean.processar}" value="#{item.descricao2}" />

</h:column>

</h:tableData>

crie uma método chamado processar e que retorne uma string com a página q vc quer ir no caso (resultado.jsp) de acordo com seu arquivo de navegação normalmente é chamado de faces-config.xml, neste método pesquise o que precisar (no seu caso crie o objeto que pretende detalhar) pegando do request o objeto cujo nome é “item” o mesmo nome definido na variável “var” do <h:tableData. Com isso seu código ficará mais cosizo e não necessitará utilizar scriplets.

>

Criado 8 de janeiro de 2007
Ultima resposta 8 de jan. de 2007
Respostas 1
Participantes 2