dúvida JSF + RICH FACES

8 respostas
kelvis

PessoALL

Seguinte… tenho uma página que carrega uma lista de clientes e ao lado de cada registro tem um a4j:commandButton que ao ser clicado chama outra página p/ realizar um pedido para aquele cliente… até ai blz…

O problema é que quando ele chama a página de realizar pedido não tô conseguindo recuperar o “id” do cliente!

meu command Button que chama cadastrarPedido.xhtml

<a4j:region>
	<rich:dataTable id="tbclientes" value="#{actionClientes.listaClientes}"
		var="item" rows="4" style="width: 100%;"
		binding="#{actionClientes.table}">
		<f:facet name="header">
			<h:outputText value="Lista de Clientes" />
		</f:facet>
		<rich:column>
			<f:facet name="header">
				<h:outputText value="Código" />
			</f:facet>
			<h:outputText value="#{item.codCliente}" />
		</rich:column>
		<rich:column>
			<f:facet name="header">
				<h:outputText value="Nome" />
			</f:facet>
			<h:outputText value="#{item.nome}" />
		</rich:column>
                           <rich:column>
			<f:facet name="header">
				<h:outputText value="Realizar Pedido" />
			</f:facet>
			<a4j:commandButton image="imagens/realizarPedido.png"
				alt="Realizar Pedido para este cliente"
				action="#{actionClientes.homeCadastrarPedido}">
				<f:param id="idPedido" name="idPedido" value="#{item.codCliente}" />
				<!--<f:setPropertyActionListener value="#{item}" target="#{actionClientes.clientes}"/>-->
			</a4j:commandButton>
		</rich:column>
	</rich:dataTable>

Método homeCadastrarPedido que recupera o “id” e redireciona para cadastrarPedido.xhtml (já debuguei e esse método tá trazendo o id que preciso)

public String homeCadastrarPedido(){
		
		Clientes cliente = new Clientes();
		try {
			cliente = (Clientes)((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getAttribute("item");
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage("erro",
					new FacesMessage("Falha ao recuperar registro do cliente!"));
		}
		
		this.clientes = cliente;
		return "cadastrarpedido";
	}

e finalmente a página cadastrarPedido.xhtml que deveria receber o id mas tá recebendo 0 (criei um inputText para ver se o id tá chegando mas só vem 0)

<rich:panel id="cadastrarPedido" style="width: 900px;">
<f:facet name="header">
<h:outputText value="Cadastro de Pedidos"></h:outputText>
</f:facet>
<h:panelGrid  columns="1">
	
	<rich:columnGroup>
	<h:column ><h:outputText value="Cliente:"/></h:column>
	<h:column><h:inputText value="#{actionClientes.clientes.codCliente}"/></h:column>
	</rich:columnGroup>
</h:panelGrid>
</rich:Panel>

espero que alguém possa me ajudar!!

8 Respostas

marcos.junqueira

Tente algo como

&lt;f:setPropertyActionListener value="#{item.id}" target="#{actionClientes.idSelecionado}"/&gt;

assim na action você recupera o valor do idSelecionado.

marcos.junqueira

Outra coisa, isso não vai funcionar, pois o value e target tem que ser do mesmo tipo.

&lt;!--&lt;f:setPropertyActionListener value="#{item}" target="#{actionClientes.clientes}"/&gt;--&gt;
kelvis

mas “item” é o meu Objeto Cliente completo recuperado da página através do getAtributte… Eu descomentei essa linha e testei, na outra página chega 0 do mesmo jeito… Acho que o problema tá na forma como estou recebendo o id na página cadastrarPedidos.xhtml

e ainda testei:

<f:setPropertyActionListener value="#{item.codCliente}" target="#{actionClientes.clientes.codCliente}"/>

chega 0 também!!

marcos.junqueira

Veja esse exemplo, utilizei o setPropertyActionListener para passar o objeto da linha escolhida para minha action ao excluir e ao editar.

list.xhtml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;f:view xmlns:ext="http://edorasframework.org/extfaces/facelets" xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ice="http://www.icesoft.com/icefaces/component" xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"&gt;
    &lt;ice:portlet&gt;
        &lt;ui:include src="../../styling.xhtml" /&gt;
        &lt;ice:form id="produtoForm" partialSubmit="true"&gt;
            &lt;ice:messages/&gt;
            &lt;ice:commandButton action="add" value="Novo Produto"/&gt;
            &lt;ice:dataTable var="produto" value="#{ProdutoSupport.produtos}" width="100%"&gt;
                &lt;ice:column&gt;
                    &lt;f:facet name="header"&gt;
                        &lt;ice:outputText value="ID"/&gt;
                    &lt;/f:facet&gt;
                    &lt;ice:outputText value="#{produto.produtoId}"/&gt;
                &lt;/ice:column&gt;
                &lt;ice:column&gt;
                    &lt;f:facet name="header"&gt;
                        &lt;ice:outputText value="Nome"/&gt;
                    &lt;/f:facet&gt;
                    &lt;ice:outputText value="#{produto.nome}"/&gt;
                &lt;/ice:column&gt;
                &lt;ice:column&gt;
                    &lt;ice:commandButton action="edit" value="Editar"&gt;
                        &lt;f:setPropertyActionListener target="#{ProdutoController.produto}" value="#{produto}"/&gt;
                    &lt;/ice:commandButton&gt;
                &lt;/ice:column&gt;
                &lt;ice:column&gt;
                    &lt;ice:commandButton action="#{ProdutoController.deleteProduto}" value="Excluir"&gt;
                        &lt;f:setPropertyActionListener target="#{ProdutoController.produto}" value="#{produto}"/&gt;
                    &lt;/ice:commandButton&gt;
                &lt;/ice:column&gt;
            &lt;/ice:dataTable&gt;
        &lt;/ice:form&gt;
    &lt;/ice:portlet&gt;
&lt;/f:view&gt;

edit.xhtml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;f:view xmlns:ext="http://edorasframework.org/extfaces/facelets" xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ice="http://www.icesoft.com/icefaces/component" xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"&gt;
    &lt;ice:portlet&gt;
        &lt;ui:include src="../../styling.xhtml" /&gt;
        &lt;ice:form id="produtoForm" partialSubmit="true"&gt;
            &lt;ice:messages/&gt;
            &lt;ice:inputHidden value="#{ProdutoController.produto.produtoId}"/&gt;
            &lt;ice:panelGrid columns="2"&gt;
                &lt;ice:outputLabel value="Nome"/&gt;
                &lt;ice:inputText value="#{ProdutoController.produto.nome}"/&gt;
            &lt;/ice:panelGrid&gt;
            &lt;ice:commandButton action="#{ProdutoController.updateProduto}" value="Atualizar"/&gt;
        &lt;/ice:form&gt;
    &lt;/ice:portlet&gt;
&lt;/f:view&gt;

ProdutoSupport.java

package br.com.neoplacker.faces.impl;

import br.com.neoplacker.model.Produto;
import br.com.neoplacker.model.Produto;
import br.com.neoplacker.service.ProdutoLocalServiceUtil;
import com.liferay.portal.SystemException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.model.SelectItem;

/**
 * 
 * @author <a mailto:[email removido]>Marcos O. Junqueira</a>
 */
public class ProdutoController extends GenericController {

    private Produto produto;
    private ProdutoSupport produtoSupport;

    public ProdutoController() {
        setProduto(new ProdutoImpl());
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public ProdutoSupport getProdutoSupport() {
        return produtoSupport;
    }

    public void setProdutoSupport(ProdutoSupport produtoSupport) {
        this.produtoSupport = produtoSupport;
    }

    public String addProduto() {
        try {
            ProdutoLocalServiceUtil.addProduto(produto);
        } catch (SystemException ex) {
            Logger.getLogger(ProdutoController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
            error(ex.getMessage());
        }
        produtoSupport.loadProdutos();
        return "list";
    }

    public String deleteProduto() {
        try {
            ProdutoLocalServiceUtil.deleteProduto(produto);
        } catch (SystemException ex) {
            Logger.getLogger(ProdutoController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
            error(ex.getMessage());
        }
        produtoSupport.loadProdutos();
        return null;
    }

    public String updateProduto() {
        try {
            ProdutoLocalServiceUtil.updateProduto(produto);
        } catch (SystemException ex) {
            Logger.getLogger(ProdutoController.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
            error(ex.getMessage());
        }
        produtoSupport.loadProdutos();
        return "list";
    }
}

faces-config.xml

&lt;managed-bean&gt;
        &lt;managed-bean-name&gt;ProdutoSupport&lt;/managed-bean-name&gt;
        &lt;managed-bean-class&gt;br.com.neoplacker.faces.impl.ProdutoSupport&lt;/managed-bean-class&gt;
        &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
    &lt;/managed-bean&gt;
    &lt;managed-bean&gt;
        &lt;managed-bean-name&gt;ProdutoController&lt;/managed-bean-name&gt;
        &lt;managed-bean-class&gt;br.com.neoplacker.faces.impl.ProdutoController&lt;/managed-bean-class&gt;
        &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
        &lt;managed-property&gt;
            &lt;property-name&gt;produtoSupport&lt;/property-name&gt;
            &lt;value&gt;#{ProdutoSupport}&lt;/value&gt;
        &lt;/managed-property&gt;
    &lt;/managed-bean&gt;
    &lt;navigation-rule&gt;
        &lt;from-view-id&gt;/xhtml/edit/produto/list.xhtml&lt;/from-view-id&gt;
        &lt;navigation-case&gt;
            &lt;from-outcome&gt;add&lt;/from-outcome&gt;
            &lt;to-view-id&gt;/xhtml/edit/produto/add.xhtml&lt;/to-view-id&gt;
        &lt;/navigation-case&gt;
        &lt;navigation-case&gt;
            &lt;from-outcome&gt;edit&lt;/from-outcome&gt;
            &lt;to-view-id&gt;/xhtml/edit/produto/edit.xhtml&lt;/to-view-id&gt;
        &lt;/navigation-case&gt;
    &lt;/navigation-rule&gt;
    &lt;navigation-rule&gt;
        &lt;from-view-id&gt;/xhtml/edit/produto/add.xhtml&lt;/from-view-id&gt;
        &lt;navigation-case&gt;
            &lt;from-outcome&gt;list&lt;/from-outcome&gt;
            &lt;to-view-id&gt;/xhtml/edit/produto/list.xhtml&lt;/to-view-id&gt;
        &lt;/navigation-case&gt;
    &lt;/navigation-rule&gt;
    &lt;navigation-rule&gt;
        &lt;from-view-id&gt;/xhtml/edit/produto/edit.xhtml&lt;/from-view-id&gt;
        &lt;navigation-case&gt;
            &lt;from-outcome&gt;list&lt;/from-outcome&gt;
            &lt;to-view-id&gt;/xhtml/edit/produto/list.xhtml&lt;/to-view-id&gt;
        &lt;/navigation-case&gt;
    &lt;/navigation-rule&gt;
kelvis

mudei o scopo do meu actionClientes lá no faces-config de request para session e funcionou!! rs

dei uma aprimorada no meu método que tava feio pra caramba… ficou assim

public String homeCadastrarPedido(){
		
		clientes = new Clientes();
		
		try {
		
setClientes((Clientes)((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getAttribute("item")); 
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage("erro",
					new FacesMessage("Falha ao recuperar registro do cliente!"));
		}
		
		return "cadastrarpedido";
	}
kelvis

Obrigado pela ajuda cara!!

thimor

http://www.guj.com.br/posts/list/144080.java

kelvis

Ai Thimor… Valeu pelo Tópico que me passou ai…

Aproveitando… depois que fiz o que mostrei acima, observei que quando eu clico na lista para realizar um pedido, depois quando vou acessar a opção cadastrar cliente os meus campos vem preenchidos com os dados daquele que eu tinha feito o pedido anteriormente!
Daí fiz o seguinte, no meu menu, quando eu clico no item cadastrar cliente chamo um método na minha maneged-Bean que dá new no meu Objeto cliente e ele limpa bonitinho pra mim…

Então eu pergunto… Tá certo isso que eu fiz? Tem uma forma mais bonita de implementar isso?

Valws!

Criado 19 de novembro de 2009
Ultima resposta 20 de nov. de 2009
Respostas 8
Participantes 3