[RESOLVIDO] componente dialog não recebe objeto - JSF + Priefaces

6 respostas
A

Boa tarde galera,

Procurei em todo lugar mas sem sucesso.

Estou fazendo um Dialog para editar um usuario mas não esta dando certo. Passo o objeto com o f:setPropertyActionListene mas ele so traz um unico objeto para todos os usuarios.

ex: tenho 10 usuarios. clico na primeira linha e ele me traz o dialog carregado com as informações do usuario, se eu fechar o dialog e tentar carregar outro usuario ele me traz o primeiro usuario. Não esta mudando de objeto

Segue codigo da view, se alguem puder me falar aonde estou errando.

Obs: Quando eu edito um usuario usando uma pagina.xhtml o objeto e carregado e edita normalmente.

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:composition template="/templates/interna.xhtml">
        <ui:define name="titulo">Pesquisar Usuário</ui:define>
        <ui:define name="corpo">
            <p:panel id="centro" style="font-size: 13px;">
                <h:form id="listagemUsuario">
                    <p:dataTable id="listagem" var="usuario" value="#{pessoaBean.lista}" scrollable="true" scrollHeight="400">
                        <p:column headerText="Nome" style=" width: 40%">
                            #{usuario.nome}
                        </p:column>
                        
                        <p:column headerText="Login" style="width: 15%">
                            #{usuario.login}
                        </p:column>
                        
                        <p:column headerText="Permissão" style="text-align: center; width: 15%">
                            <h:graphicImage library="imagens" name="pessoa_#{usuario.permissao}.png"/> 
                        </p:column>
                        
                        <p:column headerText="Status" style="text-align: center; width: 5%">
                            <h:commandLink action="#{pessoaBean.ativar}" >
                                <h:graphicImage library="imagens" name="pessoa_#{usuario.ativo}.png" /> 
                                <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" /> 
                            </h:commandLink>
                        </p:column>
                        
                        <!-- Aqui estou tentando editar por um dialog -->

                        <p:column headerText="Visualizar" style="text-align: center; width: 5%" >
                            <p:commandLink oncomplete="visualizarDialog.show()"  update="@form">
                                <h:graphicImage library="imagens" name="visualizar_dados.png" />
                                <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
                            </p:commandLink>

                            <p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
                                <h:panelGrid columns="2">
                                    <h:outputLabel value="Código: " />
                                    <h:outputLabel value="#{usuario.codigo}" />
                                    <h:outputLabel value="Nome: " />
                                    <h:inputText value="#{usuario.nome}" />
                                    <h:outputLabel value="Login: " />
                                    <h:inputText value="#{usuario.login}" />
                                    <h:outputLabel value="Status: " />
                                    <h:inputText value="#{usuario.ativo}" />
                                    <h:outputLabel value="Permissão: " />
                                    <h:inputText value="#{usuario.permissao}"/>
                                    <h:outputLabel value="Setor: " />
                                    <h:inputText value="#{usuario.setor}" />
                                    <h:outputLabel value="Cargo: " />
                                    <h:inputText value="#{usuario.cargo}" />
                                    <h:outputLabel value="Data Cadastro: " />
                                    <h:outputText value="#{usuario.dataCadastro}" />
                                </h:panelGrid>
                            </p:dialog>

                        </p:column>

                        <!--  Assim consigo editar o usuario, mas carregando o objeto em uma pagina xhtml. -->

                        <p:column headerText="Editar"  style="text-align: center; width: 10%">
                            <h:commandLink action="#{pessoaBean.editar}">
                                <h:graphicImage library="imagens" name="editar_pessoa.png" />
                                <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
                                <f:setPropertyActionListener target="#{pessoaBean.paginaDestino}" value="/restrito/cadastro_usuario" />
                            </h:commandLink>
                        </p:column>
                        
                    </p:dataTable>
                </h:form>
            </p:panel>
        </ui:define>
    </ui:composition> 
</html>

Bean

@ManagedBean(name="pessoaBean")
@RequestScoped
public class PessoaBean {
      
    private Pessoa pessoa = new Pessoa();
    private List<Pessoa> lista;
    private String paginaDestino;
    
    public String salvar(){
        
        PessoaRN pessoaRN = new PessoaRN();
        this.pessoa.setDataCadastro(new Date());
        this.pessoa.setAtivo(true);
        pessoaRN.salvar(pessoa);
        
        return this.paginaDestino = "pesquisa_usuario?faces-redirect=true";
    }
    
    public String ativar(){
        if(this.pessoa.isAtivo())
            this.pessoa.setAtivo(false);  
        else
            this.pessoa.setAtivo(true);   
        PessoaRN pessoaRN = new PessoaRN();
        pessoaRN.salvar(this.pessoa);
        return null;
    }
    
    
    public Pessoa getVisualizar() {
        return visualizar;
    }

    public void setVisualizar(Pessoa visualizar) {
        this.visualizar = visualizar;
    }

    public List<Pessoa> getLista() {
        if(this.lista == null){
            PessoaRN pessoaRN = new PessoaRN();
            this.lista = pessoaRN.listar();
        }
        return lista;
    }

    public void setLista(List<Pessoa> lista) {
        this.lista = lista;
    }
    
    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public String getPaginaDestino() {
        return paginaDestino;
    }

    public void setPaginaDestino(String paginaDestino) {
        this.paginaDestino = paginaDestino;
    }
    
}

6 Respostas

A

Vc deve referenciar seu objeto a partir do seu Bean.

<h:panelGrid columns="2"> <h:outputLabel value="Código: " /> <h:outputLabel value="#{pessoaBean.pessoa.codigo}" /> <h:outputLabel value="Nome: " /> <h:inputText value="#{pessoaBean.pessoa.nome}" /> // segue seu codigo... </h:panelGrid>

H

Cara,

Substitui o trecho de código que vc atualiza o form para atualizar o dialog.

<p:commandLink oncomplete="visualizarDialog.show()"  update="@form">  
          <h:graphicImage library="imagens" name="visualizar_dados.png" />  
          <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />  
  </p:commandLink>

para

<p:commandLink oncomplete="visualizarDialog.show()"  update="visualizarDialog">  
          <h:graphicImage library="imagens" name="visualizar_dados.png" />  
          <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />  
  </p:commandLink>

Fiz uma POC tentanto estar o mais proximo possivel do seu código.

public class Pessoa {

	private String nome;
	private String login;
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}	
}
@ManagedBean(name="pessoaBean")  
@RequestScoped
public class PessoaBean {
	
	private Pessoa pessoa;
	private List<Pessoa> lista;
	
	public PessoaBean(){
		lista = new ArrayList<Pessoa>();
		criarDadosFake();
	}
	
	private void criarDadosFake(){
		Pessoa p = new Pessoa();
		for (int i = 0; i < 10; i++) {
			p.setLogin("login"+i);
			p.setNome("nome"+i);
			
			lista.add(p);
			p = new Pessoa();			
		}
		
	}

	public List<Pessoa> getLista() {
		return lista;
	}

	public void setLista(List<Pessoa> lista) {
		this.lista = lista;
	}

	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}
	
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<title>Pessoa</title>
</h:head>
<h:body>
	<h:form id="listagemUsuario">
		<p:dataTable id="listagem" var="usuario" value="#{pessoaBean.lista}" scrollable="true" scrollHeight="400">
			<p:column headerText="Nome" style=" width: 40%">#{usuario.nome}</p:column>
			<p:column headerText="Login" style="width: 15%">#{usuario.login}</p:column>
			
			<p:column headerText="Visualizar" style="text-align: center; width: 5%">
				<p:commandLink oncomplete="visualizarDialog.show()"  update="visualizarDialog">
					<h:outputLabel value="link" /> 
                    <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />  
                 </p:commandLink>
                 
                 <p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">  
                      <h:panelGrid columns="2">  
                          <h:outputLabel value="Nome: "/>  
                          <h:inputText value="#{usuario.nome}"/>  
                          <h:outputLabel value="Login: "/>  
                          <h:inputText value="#{usuario.login}"/>
                      </h:panelGrid>  
                  </p:dialog>
                  
			</p:column> 
		</p:dataTable>
		
	</h:form>
</h:body>
</html>

Espero que tenha te ajudado.....

H

Segue uma forma mais elegante de se aplicar a seleção em tabelas usando PrimeFaces.

Pojo:
public class Pessoa {

	private String nome;
	private String login;
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}	
}
DataModel:
public class PessoaDataModel extends ListDataModel<Pessoa> implements SelectableDataModel<Pessoa>{

	public PessoaDataModel(){}
	
	public PessoaDataModel(List<Pessoa> data){
		super(data);
	}
	
	@Override
	public Pessoa getRowData(String rowKey) {
		List<Pessoa> pessoas = (List<Pessoa>) getWrappedData();
		for (Pessoa pessoa : pessoas) {
			String key = pessoa.getLogin() + pessoa.getNome();
			if(key.equals(rowKey)){
				return pessoa;				
			}
		}
		return null;
	}

	@Override
	public Object getRowKey(Pessoa pessoa) {		
		return (pessoa.getLogin()+pessoa.getNome());
	}
}
Bean:
@ManagedBean(name="pessoaBean")  
@SessionScoped
public class PessoaBean {
	
	private Pessoa pessoa;
	private List<Pessoa> lista;
	private PessoaDataModel dataModel;
	
	public PessoaBean(){
		lista = new ArrayList<Pessoa>();		
		criarDadosFake();
		
		dataModel = new PessoaDataModel(lista);
	}
	
	private void criarDadosFake(){
		Pessoa p = new Pessoa();
		for (int i = 0; i < 10; i++) {
			p.setLogin("login"+i);
			p.setNome("nome"+i);
			
			lista.add(p);
			p = new Pessoa();			
		}		
	}
	
	public void aoSelecionar(SelectEvent event) {  
        FacesMessage msg = new FacesMessage("Car Selected", ((Pessoa) event.getObject()).getNome());
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  

	public List<Pessoa> getLista() {
		return lista;
	}

	public void setLista(List<Pessoa> lista) {
		this.lista = lista;
	}

	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public PessoaDataModel getDataModel() {
		return dataModel;
	}

	public void setDataModel(PessoaDataModel dataModel) {
		this.dataModel = dataModel;
	}
	
}
XHTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<title>Pessoa</title>
</h:head>
<h:body>
	<h:form id="listagemUsuario">
		<p:growl id="growl" showDetail="true"/>
	
		<p:dataTable id="listagem" var="usuario" value="#{pessoaBean.dataModel}" paginator="true" rows="10" selection="#{pessoaBean.pessoa}" selectionMode="single">
			
			<p:ajax event="rowSelect" listener="#{pessoaBean.aoSelecionar}"  update=":listagemUsuario:visualizarDialog :listagemUsuario:growl" oncomplete="visualizarDialog.show()" />
		
			<p:column headerText="Nome" style=" width: 40%">#{usuario.nome}</p:column>
			<p:column headerText="Login" style="width: 15%">#{usuario.login}</p:column>
									 
		</p:dataTable>
		
		
		<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">  
              <h:panelGrid columns="2">  
                  <h:outputLabel value="Nome: "/>  
                  <h:inputText value="#{pessoaBean.pessoa.nome}"/>  
                  <h:outputLabel value="Login: "/>  
                  <h:inputText value="#{pessoaBean.pessoa.login}"/>
              </h:panelGrid>  
          </p:dialog>
	</h:form>
</h:body>
</html>
L

Fala adi_silva, tranquilo?

O problema no seu caso é que você não está fazendo um update do dialog a cada seleção, então o conteúdo exibido na view permanece com os dados do primeiro usuário selecionado. Trabalhando com o primefaces, eu sempre deixo um <p:ajax> dentro do dataTable, para que assim que uma linha seja selecionada, o panel seja re-renderizado com os valores do novo usuário

Aqui eu resolvi da seguinte forma:

<p:dataTable
			id="tableFuncionario"
			widgetVar="tableFuncionario"
			var="func"
			value="#{permissionController.userList}"
			styleClass="centralizado"
			style="width: 60%"
			emptyMessage="Nenhum registro encontrado"
			paginator="true"
			paginatorAlwaysVisible="false"
			rowKey="#{func.userName}"
			selectionMode="single"
			selection="#{permissionController.selectedUser}"
			rows="15">

			<p:ajax
				event="rowSelect"
				process="@this"
				update=":form:dialogPermissao"
				oncomplete="dialogPermissao.show()" />

			<f:facet name="header">
				<h:outputText value="Pesquisa de funcionários" />
			</f:facet>

			<p:column
				style="width: 15%"
				headerText="Login"
				sortBy="#{func.userName}"
				styleClass="column">
				<h:outputText value="#{func.userName}" />
			</p:column>

			<p:column
				style="width: 55%"
				headerText="Nome completo"
				sortBy="#{func.fullName}"
				styleClass="column">
				<h:outputText value="#{func.fullName}" />
			</p:column>

			<p:column
				style="width: 30%"
				headerText="E-mail:"
				sortBy="#{func.mail}"
				styleClass="column">
				<h:outputText value="#{func.mail}" />
			</p:column>

			<f:facet name="footer">
				<h:outputText value="Clique em um funcionário para gerenciar a permissão" />
			</f:facet>

		</p:dataTable>

		<p:spacer
			width="100%"
			height="25" />

		<p:dialog
			id="dialogPermissao"
			modal="true"
			widgetVar="dialogPermissao"
			header="Gerenciar permissão"
			closable="true"
			draggable="false"
			resizable="false"
			styleClass="centralizado"
			width="340"
			onHide="tableFuncionario.unselectAllRows();">

			<h:panelGrid
				columns="2"
				styleClass="centralizado">
				<h:outputText
					styleClass="label"
					value="Nome: " />
				<h:outputText value="#{permissionController.selectedUser.fullName}" />
				<h:outputText
					styleClass="label"
					value="Login: " />
				<h:outputText value="#{permissionController.selectedUser.userName}" />
				<h:outputText
					styleClass="label"
					value="E-mail: " />
				<h:outputText value="#{permissionController.selectedUser.mail}" />
			</h:panelGrid>

			<p:spacer
				width="100%"
				height="5" />

			<p:commandButton
				id="btnConceder"
				value="Conceder permissão"
				icon="ui-icon-check"
				styleClass="centralizado"
				action="#{permissionController.grantPermission}"
				process="@this"
				oncomplete="tableFuncionario.unselectAllRows(); dialogPermissao.hide()" />

			<p:spacer width="5" />

			<p:commandButton
				id="btnRevogar"
				value="Revogar permissão"
				icon="ui-icon-close"
				styleClass="centralizado"
				action="#{permissionController.revokePermission}"
				process="@this"
				oncomplete="tableFuncionario.unselectAllRows(); dialogPermissao.hide()" />
		</p:dialog>

Dessa forma o dialog sempre é exibido quando se clica em uma linha do dataTable, e os dados do funcionário são carregados.
Lembre-se que é preciso criar uma propriedade no seu controller para armazenar o usuário selecionado da lista ok? :wink:

A

Valeo galera resolvido.

Usei a dica do nosso amigo hmsilva troquei o @form pelo nome do Dialog.

Ficou assim.

<p:commandLink oncomplete="visualizarDialog.show()"  update="visualizarDialog">
      <h:graphicImage library="imagens" name="visualizar_dados.png" />
      <f:setPropertyActionListener target="#{pessoaBean.pessoa}" value="#{usuario}" />
</p:commandLink>

<!-- Dialog -->

<p:dialog id="visualizarDialog" header="Dados do Usuário" widgetVar="visualizarDialog" width="400" modal="true" resizable="false">
            <h:panelGrid columns="2">
            <h:outputLabel value="Código: " />
            <h:outputLabel value="#{usuario.codigo}" />
            <h:outputLabel value="Nome: " />
            <h:inputText value="#{usuario.nome}" />
            <h:outputLabel value="Login: " />
            <h:inputText value="#{usuario.login}" />
            <h:outputLabel value="Status: " />
            <h:inputText value="#{usuario.ativo}" />
            <h:outputLabel value="Permissão: " />
            <h:inputText value="#{usuario.permissao}"/>
            <h:outputLabel value="Setor: " />
            <h:inputText value="#{usuario.setor}" />
            <h:outputLabel value="Cargo: " />
            <h:inputText value="#{usuario.cargo}" />
            <h:outputLabel value="Data Cadastro: " />
           <h:outputText value="#{usuario.dataCadastro}" />
     </h:panelGrid>
</p:dialog>

Grato pela ajuda de todos

H

Opa, Tamo injetado, compilado e executado…

Criado 19 de novembro de 2012
Ultima resposta 20 de nov. de 2012
Respostas 6
Participantes 4