Grade de dados - JSF

montei a sequinte tabela:

<h:dataTable styleClass=“label_Dados” width=“100%” var=“clientes” value="#{alterarCliente.lista}">

<h:column>
<h:commandLink action="#{clientes.atualizar}"><h:outputText value="#{clientes.nome}" /></h:commandLink>

</h:column>

</h:dataTable>

como faco para no meu bean pegar qual foi o cliente selecionado ?

Estou usando JSF pela primeira vez, mas acredito que para fazer isso voce precisa ter essa lista na sessao, pois ao clicar no link o componente procura o objeto Cliente nessa lista, ele da um getLista().

nao entendi sua resposta …

vc quer fazer o que? vc nao quer clicar no link do cliente que deseja alterar e em outra tela exibir os dados do cliente clicado? Pelo menos foi isso que entendi. Eu to falando que o componente já faz esse trabalho pra vc, de saber qual foi clicado e inclusive ja tem o objeto em maos, mas ele precisa pesquisar na lista que vc montou, e para isso essa lista precisa estar em sessao, pois ela é perdida no request. Entendeu?

agora entendi e como eu faco para pegar este objeto vc tem algum exemplo ?

Olha só:

eu tenho uma classe com os campos:


private List projetos;
private ProjetoVO projeto;

Certo? Na hora de montar minha lista eu usei o classe.projetos
Nessa mesma classe, tem o metodo:

public String consultarProjetos(){
this.projetos = projetoServico.consultarProjetos(filtro);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“projetos”, projetos);

Ou seja, ao montar a lista eu nao so atribui o valor a variavel, eu tambem coloquei na sessao. Pois quando vc clica no commandLink ele faz o seguinte: dá um get no campo da lista, no meu caso getProjetos();

e getProjetos ta assim:

public List getProjetos() {
if (projetos == null){
projetos = (List) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(“projetos”);
}

O meu commandLink chama o metodo detalharProjeto();
que está assim:

public String detalharProjeto(){
projeto = (ProjetoVO) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(“projeto”);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“projeto”, projeto);

E pronto, ele está na propriedade projeto da minha classe.
na proxima tela eu simplesmente exibo todos os campos do objeto.
Ajudou?

Olha só:

eu tenho uma classe com os campos:


private List projetos;
private ProjetoVO projeto;

Certo? Na hora de montar minha lista eu usei o classe.projetos
Nessa mesma classe, tem o metodo:

public String consultarProjetos(){
this.projetos = projetoServico.consultarProjetos(filtro);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“projetos”, projetos);

Ou seja, ao montar a lista eu nao so atribui o valor a variavel, eu tambem coloquei na sessao. Pois quando vc clica no commandLink ele faz o seguinte: dá um get no campo da lista, no meu caso getProjetos();

e getProjetos ta assim:

public List getProjetos() {
if (projetos == null){
projetos = (List) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(“projetos”);
}

O meu commandLink chama o metodo detalharProjeto();
que está assim:

public String detalharProjeto(){
projeto = (ProjetoVO) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(“projeto”);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“projeto”, projeto);

E pronto, ele está na propriedade projeto da minha classe.
na proxima tela eu simplesmente exibo todos os campos do objeto.
Ajudou?

Olha só:

eu tenho uma classe com os campos:


private List projetos;
private ProjetoVO projeto;

Certo? Na hora de montar minha lista eu usei o classe.projetos
Nessa mesma classe, tem o metodo:

public String consultarProjetos(){
this.projetos = projetoServico.consultarProjetos(filtro);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“projetos”, projetos);

Ou seja, ao montar a lista eu nao so atribui o valor a variavel, eu tambem coloquei na sessao. Pois quando vc clica no commandLink ele faz o seguinte: dá um get no campo da lista, no meu caso getProjetos();

e getProjetos ta assim:

public List getProjetos() {
if (projetos == null){
projetos = (List) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(“projetos”);
}

O meu commandLink chama o metodo detalharProjeto();
que está assim:

public String detalharProjeto(){
projeto = (ProjetoVO) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(“projeto”);
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“projeto”, projeto);

E pronto, ele está na propriedade projeto da minha classe.
na proxima tela eu simplesmente exibo todos os campos do objeto.
Ajudou?

Valeu deu certo …!!!

[quote=DanielPaiva]montei a sequinte tabela:

<h:dataTable styleClass=“label_Dados” width=“100%” var=“clientes” value="#{alterarCliente.lista}">

<h:column>
<h:commandLink action="#{clientes.atualizar}"><h:outputText value="#{clientes.nome}" /></h:commandLink>

</h:column>

</h:dataTable>

como faco para no meu bean pegar qual foi o cliente selecionado ?[/quote]

Amigo…

tem uma solução mais atraente, se o que vc deseja é apenas o ID do cliente selecionado.

Gere um parametro (POST) para o link, como no velho jsp, asp, php, etc, assim:
Obs.: Meu Bean é um Book, com id, title, author e um metodo selectBook()

<h:column>
<f:facet name=“header”>
<h:outputText value=“Edit”/>
</f:facet>
<h:commandLink id=“Edit”
action=“editBook”
actionListener="#{bookBean.selectBook}">

	    	&lt;h:outputText value="Edit" /&gt;
	    	&lt;f:param id="editId" 
	    			 name="id" 
	    			 value="#{book.id}" /&gt;
	    &lt;/h:commandLink&gt;

– > No método de selectBook, faça o seguinte:

UIParameter component = (UIParameter) event.getComponent().findComponent("editId"); //id do parametro
int id = Integer.parseInt(component.getValue().toString());

Onde editId é o id do book selecionado, criado no parametro <f:param> acima.

Pronto, ID recuperado.

Abraços