Passagem de parâmetro de um dataTable para outro em página diferente

4 respostas
L

Pessoal, tenho um datatable que lista notificações. Eu queria que fosse possível detalhar cada notificação em uma outra página.
Como cada linha da lista tem um ID, quero pegá-lo e utilizá-lo na datatable da outra página.

Eu pego o ID da linha assim: <p:dataTable id="notifs" var="search" value="#{searchBean.listSymptom}" rendered="#{!empty searchBean.listSymptom}"> <p:column> <c:facet name="header"> <h:outputText value="ID" /> </c:facet> <h:link outcome="showIndNotifSearch" value="#{search.code}"> <c:param name="code" value="#{search.code}" /> </h:link> </p:column> </p:dataTable>

A próxima página(showIndNotifSearch.xhtml) está assim:

<c:view>
	<c:metadata>
		<c:viewParam name="code" id="code" value="#{searchBean.selected.code}"></c:viewParam>
	</c:metadata>
</c:view>
<h:form id="texto" styleClass="centered">	
	<h:outputText value="#{searchBean.selected.code}" /> <!-- imprime o valor do code -->
	<p:dataTable id="notifs" var="cli" value="#{clinDataBean.listDataNotifSearch}" >
	</p:dataTable>

Meu bean tem isso:

public List<ClinData> getListDataNotifSearch() {
		if (this.listDataNotifSearch == null) {
			ClinDataRN clinDataRN = new ClinDataRN();
			this.listDataNotifSearch = clinDataRN.listDataNotifSearch();
		}
		return this.listDataNotifSearch;
	}

Eu gostaria de saber se tem como eu pegar esse code e utilizá-lo no meu método listDataNotifSearch() do meu Bean.
Eu já tentei fazer da seguinte forma, mas não funciona:

<p:dataTable id="notifs" var="cli" value="#{clinDataBean.listDataNotifSearch(code)}" > </p:dataTable>
e o Bean:

public List<ClinData> getListDataNotifSearch(Integer code) { if (this.listDataNotifSearch == null) { ClinDataRN clinDataRN = new ClinDataRN(); this.listDataNotifSearch = clinDataRN.listDataNotifSearch(code); } return this.listDataNotifSearch; }

Agradeço desde já por qualquer ajuda. =)

4 Respostas

G

Pelo que entendi, você quer conseguir recuperar o objeto de uma linha clicada no seu datatable e seta-la no seu bean ?? É isso ?

Caso seja isso, dá uma olhada nesse link do showcase do primefaces : http://www.primefaces.org/showcase/ui/datatableRowSelectionInstant.jsf

<p:dataTable ... var="car" selection="#{tableBean.selectedCar}" selectionMode="single">

   <p:ajax event="rowSelect" listener="#{tableBean.onRowSelect}" > 

    ...
  </p:dataTable>

Bean:

public void onRowSelect(SelectEvent event) {  

Car carro = (Car) event.getObject() ;
}

Eu não sei qual é a versao do seu jar do Primefaces, caso não consiga troque a primeira linha por:

<p:dataTable ... var="car" rowKey="#{car}" selectionMode="single">	

   <p:ajax event="rowSelect" listener="#{tableBean.onRowSelect}" >

Abraços,

Gustavo

L

Oi Gustavo, muito obrigada por responder. =)
Na verdade, o que eu quero é pegar o objeto da linha clicada e abrir outra página. Nessa outra página eu quero usar esse objeto como parâmetro de uma função no dataTable.
Tipo assim,

<p:dataTable id="notifs" var="cli" value="#{clinDataBean.listDataNotifSearch(code)}" > </p:dataTable>
onde o “code” é meu objeto.

Desse jeito acima não sei se dá para fazer. Gostaria de saber se existe um jeito de pegar um objeto de uma página e utilizá-lo em outra.
Eu uso o Primefaces 3.0 e JSF 2.1.

Abração.

M

Claro que isso é possível uai.

<p:commandLink id="ajax" update="panel,display" actionListener="#{pprBean.savePerson}" style="margin-right:20px;">  
        <h:outputText value="Ajax Submit" />  
  </p:commandLink>

Esse savePerson será o metodo que você vai ter o objeto pronto e poderá direcionar o usuario para a tela desejada com o objeto selecionado

F

Você já deve ter resolvido seu problema , mas passei por algo parecido e consegui está solução

Essa é uma coluna da minha datatable

<t:column sortable="false" id="nmAnexo" columnId="nmAnexo">
      <f:facet name="header">
         <h:outputText value="Anexo" />
      </f:facet>
   <h:commandLink value="#{row.nmNome}" action="#{arquivoBean.baixarAnexo}">
  	<f:setPropertyActionListener value="#{row}" target="#{arquivoBean.rowArquivoAta}"/>
   </h:commandLink>
</t:column>

row é minha lista de objetos que está sendo mostrada na tabela.
Ex: datatable=> value="#{arquivoBean.listaObjetos}" var="row"
Ao clicar no nome do anexo ele chama o método baixarAnexo no meu Bean e nesse metodo eu preciso do objeto clicado.
Para pega-lo usei f:setPropertyActionListener
onde value recebe meu row que é minha listaObjetos e target vai setar o Objeto clicado no Objeto que criei em meu Bean.

############Bean

public class ArquivoBean implements Serializable{

private ArquivoAta rowArquivoAta;
private ArquivoAta arquivoAta;
private List<ArquivoAta> listaObjetos;

public void baixarAnexo() {
                        //Aqui pego o objeto clicado 
			this.setArquivoAta(this.getRowArquivoAta());
                        //arquivoAta contém o objeto clicado
			arquivoAta.getIdAta();
  }

public ArquivoAta getRowArquivoAta() {
         if(arquivoAta==null){
         arquivoAta = new ArquivoAta();
        }
		return rowArquivoAta;
	}

	public void setRowArquivoAta(ArquivoAta rowArquivoAta) {
		this.rowArquivoAta = rowArquivoAta;
       }

       public ArquivoAta getArquivoAta() {
        return arquivoAta;		
	}

	public void setArquivoAta(ArquivoAta arquivoAta) {
         if(arquivoAta==null){
           arquivoAta = new ArquivoAta();
         }
        	this.arquivoAta = arquivoAta;
	}

}

Não sei sé está é a melhor forma mas, resolveu pra min
Abraços.

Criado 31 de julho de 2013
Ultima resposta 13 de nov. de 2013
Respostas 4
Participantes 4