Explicação de Código- JSF + PrimeFaces [RESOLVIDO]

Galera, tudo bom com vocês?
Seguinte galera, estou numa faze complicada de minha vida, que é o TCC. Muitos aí já devem ter passado por isso, com certeza.

Para quem usa PrimeFaces, também tenho certeza que uma das grandes referências que teve para aprender foi o próprio site do PrimeFaces (http://primefaces.org/).

Estou tentando fazer um dataTable igual esse:
http://www.primefaces.org/showcase/ui/datatableRowSelectionByColumn.jsf
que é uma tabela onde consigo visualizar meus dados detalhadamente ao clicar no botão com a lupa.
Mas sendo bem direto, eu gostaria que alguém me explicasse um pouco esse código de exemplo, para eu poder adaptá-lo conforme a minha necessidade.
O código é esse:

<h:form id="form">

    <p:growl id="msgs" showDetail="true" />

    <p:dataTable id="cars" var="car" value="#{tableBean.carsSmall}">

        <p:column headerText="Model" style="width:24%">
            <h:outputText value="#{car.model}" />
        </p:column>

        <p:column headerText="Year" style="width:24%">
            <h:outputText value="#{car.year}" />
        </p:column>

        <p:column headerText="Manufacturer" style="width:24%">
            <h:outputText value="#{car.manufacturer}" />
        </p:column>

        <p:column headerText="Color" style="width:24%">
            <h:outputText value="#{car.color}" />
        </p:column>

        <p:column style="width:4%">
                <p:commandButton id="selectButton" update=":form:display" oncomplete="carDialog.show()" icon="ui-icon-search" title="View">
                <f:setPropertyActionListener value="#{car}" target="#{tableBean.selectedCar}" />
            </p:commandButton>
        </p:column>

    </p:dataTable>

    <p:dialog header="Car Detail" widgetVar="carDialog" resizable="false" id="carDlg"
                showEffect="fade" hideEffect="explode" modal="true">

        <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">

            <f:facet name="header">
                <p:graphicImage value="/images/cars/#{tableBean.selectedCar.manufacturer}.jpg"/>
            </f:facet>

            <h:outputText value="Model:" />
            <h:outputText value="#{tableBean.selectedCar.model}" style="font-weight:bold"/>

            <h:outputText value="Year:" />
            <h:outputText value="#{tableBean.selectedCar.year}" style="font-weight:bold"/>


            <h:outputText value="Manufacturer:" />
            <h:outputText value="#{tableBean.selectedCar.manufacturer}" style="font-weight:bold"/>

            <h:outputText value="Color:" />
            <h:outputText value="#{tableBean.selectedCar.color}" style="font-weight:bold"/>

        </h:panelGrid>

    </p:dialog>

</h:form>

E o ManagedBean é esse:

package org.primefaces.examples.view;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.primefaces.examples.domain.Car;

public class TableBean {

    static {
		colors = new String[10];
		colors[0] = "Black";
		colors[1] = "White";
		colors[2] = "Green";
		colors[3] = "Red";
		colors[4] = "Blue";
		colors[5] = "Orange";
		colors[6] = "Silver";
		colors[7] = "Yellow";
		colors[8] = "Brown";
		colors[9] = "Maroon";

		manufacturers = new String[10];
		manufacturers[0] = "Mercedes";
		manufacturers[1] = "BMW";
		manufacturers[2] = "Volvo";
		manufacturers[3] = "Audi";
		manufacturers[4] = "Renault";
		manufacturers[5] = "Opel";
		manufacturers[6] = "Volkswagen";
		manufacturers[7] = "Chrysler";
		manufacturers[8] = "Ferrari";
		manufacturers[9] = "Ford";
	}

    private final static String[] colors;

	private final static String[] manufacturers;

	private List<Car> cars;

	private Car selectedCar;

	public TableBean() {
        cars = new ArrayList<Car>();

		populateRandomCars(cars, 50);
	}

    private void populateRandomCars(List<Car> list, int size) {
		for(int i = 0 ; i < size ; i++)
			list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor()));
	}

	public Car getSelectedCar() {
		return selectedCar;
	}
	public void setSelectedCar(Car selectedCar) {
		this.selectedCar = selectedCar;
	}

	public List<Car> getCars() {
		return cars;
	}

    private int getRandomYear() {
		return (int) (Math.random() * 50 + 1960);
	}

	private String getRandomColor() {
		return colors[(int) (Math.random() * 10)];
	}

	private String getRandomManufacturer() {
		return manufacturers[(int) (Math.random() * 10)];
	}

	private String getRandomModel() {
		return UUID.randomUUID().toString().substring(0, 8);
	}
}

O que eu gostaria galera, se alguém pudesse me ajuda é:
1 - na linha 25 do xhtml, diz value="#{car}"; esse “car” seria o mesmo nome ou a mesma variável declarada na linha 5, var=“car”?
Existe alguma relação em terem o mesmo nome?

2 - na mesma linha 25, o quer dizer e para que serve o target?
3 - e porque o target aponta para #{tableBean.selectedCar}?

Galera, de coração, muito obrigado!

[]'s

1- Isso mesmo o #{car} é o var que vc informou no inicio do datatable;

2- para onde vai o objeto.
3- variavel que está no seu bean, a qual vai receber o objeto selecionado na ação.

ou seja:

vc define uma variavel no começo do datatable, e quando existir a ação o jsf atravéz da tag f:setPropertyActionListener vai injetar o objeto na variavel do seu bean.

Entendii!!
Mas, isso me gerou uma dúvida!

Veja o meu código.xhtml:

<h:form id="formTable">
                    <p:dataTable id="tb" var="inst" 
                                 value="#{instituicaoMB.exibirTodasInstituicoes()}"
                                 styleClass="datatable-default"
                                 paginator="true" rows="5"  
                                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">
                        <p:column headerText="Nome"
                                  styleClass="column-default">
                            <h:outputText value="#{inst.nomeInstituicao}" />
                        </p:column>

                        <p:column headerText="Diretor(a)"
                                  styleClass="column-default">
                            <h:outputText value="#{inst.diretorInstituicao}" />
                        </p:column>

                        <p:column headerText="Endereço"
                                  styleClass="column-default">
                            <h:outputText value="#{inst.enderecoInstituicao}" />
                        </p:column>

                        <p:column headerText="Telefone"
                                  styleClass="column-default">
                            <h:outputText value="#{inst.telefoneInstituicao}" />
                        </p:column>
                        <p:column styleClass="column-very-small">
                            <p:commandButton icon="ui-icon-search" 
                                             oncomplete="mostrar.show()" 
                                             title="Visualizar">
                                <f:setPropertyActionListener value="#{inst}" target="#{instituicaoMB.inBean.nomeInstituicao}" />
                            </p:commandButton>
                        </p:column>
                    </p:dataTable>
                    <p:dialog header="Detalhes" 
                              widgetVar="mostrar" 
                              closable="true" 
                              appendToBody="true" 
                              showEffect="fade" 
                              hideEffect="explode" 
                              modal="true">
                            <h:outputText value="Nome: " />
                            <h:outputText value="#{instituicaoMB.inBean.nomeInstituicao}" /> <br />
                    </p:dialog>
                </h:form>

E também o meu ManagedBean:

@ManagedBean
@RequestScoped
public class InstituicaoMB {

    private String idInstituicao;
    private String nomeInstituicao;
    private String diretorInstituicao;
    private String enderecoInstituicao;
    private String telefoneInstituicao;
    private InstituicaoBean inBean;

    public void setInBean(InstituicaoBean inBean) {
        this.inBean = inBean;
    }
    
    public InstituicaoBean getInBean() {
        return inBean;
    }
    
    public String getIdInstituicao() {
        return idInstituicao;
    }

    public void setIdInstituicao(String idInstituicao) {
        this.idInstituicao = idInstituicao;
    }

    public String getNomeInstituicao() {
        return nomeInstituicao;
    }

    public void setNomeInstituicao(String nomeInstituicao) {
        this.nomeInstituicao = nomeInstituicao;
    }

    public String getDiretorInstituicao() {
        return diretorInstituicao;
    }

    public void setDiretorInstituicao(String diretorInstituicao) {
        this.diretorInstituicao = diretorInstituicao;
    }

    public String getEnderecoInstituicao() {
        return enderecoInstituicao;
    }

    public void setEnderecoInstituicao(String enderecoInstituicao) {
        this.enderecoInstituicao = enderecoInstituicao;
    }

    public String getTelefoneInstituicao() {
        return telefoneInstituicao;
    }

    public void setTelefoneInstituicao(String telefoneInstituicao) {
        this.telefoneInstituicao = telefoneInstituicao;
    }

    public void salvarInstituicao(InstituicaoMB instituicaoMB) {

        try {
            InstituicaoBean instituicao = new InstituicaoBean();
            instituicao.setDiretorInstituicao(instituicaoMB.getDiretorInstituicao());
            instituicao.setEnderecoInstituicao(instituicaoMB.getEnderecoInstituicao());
            instituicao.setNomeInstituicao(instituicaoMB.getNomeInstituicao());
            instituicao.setTelefoneInstituicao(instituicaoMB.getTelefoneInstituicao());

            InstituicaoDAOImpl instDAOImpl = new InstituicaoDAOImpl();
            instDAOImpl.salvarOuAtualizar(instituicao);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        this.diretorInstituicao = "";
        this.enderecoInstituicao = "";
        this.nomeInstituicao = "";
        this.telefoneInstituicao = "";
        
    }

    public List<InstituicaoBean> exibirTodasInstituicoes() throws Exception {

        try {
            InstituicaoDAOImpl instDAOImpl = new InstituicaoDAOImpl();
            List<InstituicaoBean> listaInstituicoes = instDAOImpl.exibirTodasInstituicoes();

            return listaInstituicoes;

        } catch (Exception ex) {
            ex.printStackTrace();

            return null;
        }
    }
}

Ou seja, quando eu clico no botão “Visualizar”, aparece um dialog apresentando os dados da Instituição.
No meu método getInBean, que retorna o objeto do meu bean, eu havia colocado um System.out.println(inBean), e ele apresentava nulo!
Será que, por eu estar utilizando BD, eu teria que buscar os dados do objeto?
Ou estou fazendo algo errado?

Obrigado galera,[]'s

opa vc ta passando um objeto inst dentro do nome, tenta assim:

<f:setPropertyActionListener value="#{inst}" target="#{instituicaoMB.inBean}" />  

e tambem faz um update na dialog antes de abrir.

adiciona um id na dialog ex. dialog e no botao coloca update=“dialog”

acho que dai funciona certinho

PERFEITO!!
FUNCIONOU 100%!!

OBRIGADO POLVERINI!
Acho que o meu problema era no update do dialog!
Um errinho um tanto quanto “idiota”, não é? rsrsrs
Mas pra quem tá começando agora… rsrsrs

Obrigado a todos que me ajudaram, de coração!

[]'s

opa começo é assim mesmo. []'s