GARANTIR DESCONTO

Fórum Problema com selectonemenu dinamico[RESOLVIDO] #565246

30/05/2013

0

E ae pessoal, boa tarde, td certo ? seguinte eu estou com um problema em meu selectonemenu, gostaria de preencher o componente de acordo com o que for selecionado em meu outro selectonemenu, para isso coloquei no evento "valueChangeListener" do primeiro componente um metodo que limpa a lista do outro selectonemenu e busca novamente os itens para preencher, mas não esta acontecendo nada, estou usando facelets e nessa pagina resolvi colocar uma tag em ajax so pra recarregar o componente que vai mudar, é a primeira vez que uso ajax, pegei uma explicação bem simples de como usar, segue o codigo aew: VendaMain.xhtml:
<h:selectOneMenu value="#{VendaMain.empresaSelecionada}"
                             valueChangeListener="#{VendaMain.PreencherClientes}"
                             converter="ConversorEmpresa"
                             id="cbxEmpresa">
                <f:selectItem itemLabel="Todos" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaEmpresas}"
                               var="empresas"
                               itemValue="#"
                               itemLabel="#{empresas.nome}"/>
                <f:ajax render="cbxCliente" event="valueChange"/>
            </h:selectOneMenu>
            <h:outputLabel value="Clientes :" for="lblCliente" id="lblCliente"/>
            <h:selectOneMenu value="#{VendaMain.clienteSelecionado}"
                             converter="ConversorCliente"
                             required="true" requiredMessage="Selecione um cliente"
                             id="cbxCliente">
                <f:selectItem itemLabel="Selecione um cliente" itemValue="#"/>
                <f:selectItems value="#{VendaMain.listaClientes}"
                               var="clientes"
                               itemValue="#"
                               itemLabel="#{clientes.nome}"/>
            </h:selectOneMenu>
            <h:message for="lblTelefone" errorStyle="color : red"/>
metodo que limpa o list do selectonemenu de clientes e o preenche novamente se achar registros:
public void PreencherClientes(ValueChangeEvent event){
        this.listaClientes.clear();
        Empresa empresa = (Empresa)event.getNewValue();
        if (empresa != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(empresa);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                
            }
        }
    }
eu verifiquei se nenhum momento estou recebendo uma excessão, quanto a isso o metodo esta ok, acredito que o problema esta msm na pagina jsf vlw aew
José Junior

José Junior

Responder

Posts

19/06/2013

José Junior

preciso pegar no ManagedBean
Responder

Gostei + 0

19/06/2013

José Junior

preciso fazer isso pra rodar esse codigo aqui :

this.listaClientes.clear();
        Empresa empresa =  this.empresaSelecionada;
        if (empresa != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(empresa);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                
            }
        }

só que do jeito que esta como a pagina não foi submetida o valor da empresa sempre vai ser null
Responder

Gostei + 0

19/06/2013

Okabe Rintarou

[quote="juniorkun"]preciso pegar no ManagedBean
Mas aqui:
 <p:selectOneMenu value="#{VendaMain.empresaSelecionada}"  
                                     converter="ConversorEmpresa"  
                                     id="cbxEmpresa">  
                        <f:selectItem itemLabel="Todos" itemValue="#"/>  
                        <f:selectItems value="#{VendaMain.listaEmpresas}"  
                                       var="empresas"  
                                       itemValue="#"  
                                       itemLabel="#{empresas.nome}"/>  
                        <p:ajax process="cbxCliente" event="change" update="panel"/>  
                    </p:selectOneMenu>  
A propriedade empresaSelecionada não contem o valor?
Responder

Gostei + 0

19/06/2013

José Junior

sim sim, mas o que acontece é o seguinte, acesso a pagina a primeira vez, ele vai ficar com o valor null, troco o item selecionado no meu selectonemenu, só que meu evento ajax esta programado para mexer com o selectonemenu de cliente, so ele sera recarregado, então a informação de que alterei a seleção na empresa não é passada e a variavel ainda fica com o valor null, pelo menos é isso que esta acontecendo comigo aqui, tem alguma forma de eu puxar esse valor sem dar submit na pagina ?
Responder

Gostei + 0

19/06/2013

Okabe Rintarou

Boa pergunta. Tente com valueChangeListener : http://www.mkyong.com/jsf2/jsf-2-valuechangelistener-example/ Se não der certo, use a propriedade binding do jsf e faça um teste. Procure por HtmlSelectOneMenu
Responder

Gostei + 0

19/06/2013

José Junior

kra usei a ideia do HtmlSelectOneMenu fiz o metodo get e set, no metodo set coloquei meu codigo que puxa os clientes do banco, mas ainda não deu certo
public void setCbxEmpresa(HtmlSelectOneMenu cbxEmpresa) {
        this.cbxEmpresa = cbxEmpresa;
        this.listaClientes.clear();
        Empresa empresa =  ((Empresa) cbxEmpresa.getValue());
        if (empresa != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(empresa);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                
            }
        }
    }
Responder

Gostei + 0

20/06/2013

Okabe Rintarou

[quote="juniorkun"]kra usei a ideia do HtmlSelectOneMenu fiz o metodo get e set, no metodo set coloquei meu codigo que puxa os clientes do banco, mas ainda não deu certo
public void setCbxEmpresa(HtmlSelectOneMenu cbxEmpresa) {
        this.cbxEmpresa = cbxEmpresa;
        this.listaClientes.clear();
        Empresa empresa =  ((Empresa) cbxEmpresa.getValue());
        if (empresa != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(empresa);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                
            }
        }
    }
Vou fazer um teste aqui. Pesquise por: FacesMessage - getRequestMap
Responder

Gostei + 0

05/07/2013

José Junior

cara achei meu problema, era algo muito muito idiota, o selectonemenu dinamico esta funcionando sem nenhum problema, o que ferrou com meu codigo foram essas linhas aqui :
<f:metadata>
                            <f:event type="preRenderView" listener="#{VendaMain.CarregarTela}"/>
                    </f:metadata>
public void CarregarTela(){
        
        try{
            this.listaEmpresas = persistenciaEmpresa.selecionar();
            this.listaClientes = persistenciaCliente.selecionar();
        }catch(Throwable ex){
            
        }
    }
esse carregar tela estava programado para executar na hora em que a pagina fosse chamada, só que eu percebi que dpois da minha requisição ajax ele caia nesse trecho também como se a pagina estivesse sendo chamada novamente, como posso resolver isso ? preciso que esse codigo só ocorra quando eu chamar a pagina a partir do hiperlink da anterior, matando isso meu problema esta resolvido
Responder

Gostei + 0

06/07/2013

Okabe Rintarou

[quote="juniorkun"]cara achei meu problema, era algo muito muito idiota, o selectonemenu dinamico esta funcionando sem nenhum problema, o que ferrou com meu codigo foram essas linhas aqui :
<f:metadata>
                            <f:event type="preRenderView" listener="#{VendaMain.CarregarTela}"/>
                    </f:metadata>
public void CarregarTela(){
        
        try{
            this.listaEmpresas = persistenciaEmpresa.selecionar();
            this.listaClientes = persistenciaCliente.selecionar();
        }catch(Throwable ex){
            
        }
    }
esse carregar tela estava programado para executar na hora em que a pagina fosse chamada, só que eu percebi que dpois da minha requisição ajax ele caia nesse trecho também como se a pagina estivesse sendo chamada novamente, como posso resolver isso ? preciso que esse codigo só ocorra quando eu chamar a pagina a partir do hiperlink da anterior, matando isso meu problema esta resolvido
Seu ManagedBean está com qual escopo de visão?
Responder

Gostei + 0

07/07/2013

José Junior

Estou usando SessionScoped pra td no projeto
Responder

Gostei + 0

07/07/2013

Okabe Rintarou

Não entendi. O método CarregarTela() está sendo chamado quando?
Responder

Gostei + 0

08/07/2013

José Junior

ele é chamado quando eu entro na pagina, até ae tudo ok porque ele tem que preencher os selectonemenus, depois ele é chamado quando o ajax termina de recarregar os selectonemenus, isso não pode acontecer, o metodo tem que ser chamado somente quando eu entro na página e não mais.
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.br.Beans;

import com.br.Classes.Cliente;
import com.br.Classes.Empresa;
import com.br.Persistencia.ClienteBD;
import com.br.Persistencia.EmpresaBD;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpSession;


@Named("VendaMain")
@SessionScoped
public class VendaMainBean implements Serializable{
    private Empresa empresaSelecionada;
    private Cliente clienteSelecionado = new Cliente();
    private List<Empresa> listaEmpresas = new ArrayList<Empresa>();
    private List<Cliente> listaClientes = new ArrayList<Cliente>();
    private EmpresaBD persistenciaEmpresa = new EmpresaBD();
    private ClienteBD persistenciaCliente = new ClienteBD();
    private HtmlSelectOneMenu cbxEmpresa;
    
    public void CarregarTela(){
        
        try{
            this.listaEmpresas = persistenciaEmpresa.selecionar();
            this.listaClientes = persistenciaCliente.selecionar();
        }catch(Throwable ex){
            
        }
    }
    
    public void PegarClientes (){
        this.listaClientes.clear();
        if (this.empresaSelecionada != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(this.empresaSelecionada);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                
            }
        }
    }
    
    public Empresa getEmpresaSelecionada() {
        return empresaSelecionada;
    }

    public void setEmpresaSelecionada(Empresa empresaSelecionada) {
        this.empresaSelecionada = empresaSelecionada;
    }
       
    public Cliente getClienteSelecionado() {
        return this.clienteSelecionado;
    }

    public void setClienteSelecionado(Cliente clienteSelecionado) {
        this.clienteSelecionado = clienteSelecionado;
    }

    public void PreencherClientes(){
        
        
    }
    
    public List<Empresa> getListaEmpresas() {
        return listaEmpresas;
    }

    public void setListaEmpresas(List<Empresa> listaEmpresas) {
        this.listaEmpresas = listaEmpresas;
    }

    public List<Cliente> getListaClientes() {
        return listaClientes;
    }

    public void setListaClientes(List<Cliente> listaCliente) {
        this.listaClientes = listaCliente;
    }
    
    public String AbrirVenda(){
        String retorno;
        if (this.clienteSelecionado == null){
            retorno = "";
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selecione um cliente", "" );
            FacesContext.getCurrentInstance().addMessage(null, message);
        }else{
            HttpSession sessaoVenda = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
            sessaoVenda.setAttribute("VendaSessao", this.clienteSelecionado);
            retorno = "VendaAbrir.xhtml";
        }
        return retorno;
    }
    
}

Responder

Gostei + 0

09/07/2013

Okabe Rintarou

Entendi. Tive o mesmo problema recentemente. Há 2 formas de resolver isso ( que eu conheça). 1) Na primeira chamada a página, não há atributos de request. Ou seja, você pode validar se há parametros presentes:
    public static boolean hasRequestParameter() {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterNames().hasNext();
    }
Se não houver, significa que é a primeira chamada. As chamadas subsequentes, dentro da própria página, terão argumentos, e o método irá detectar isso.
Responder

Gostei + 0

10/07/2013

José Junior

cara fiz uns testes com esse método que você me passou, mas ele esta sempre retornando true, tanto quando entro na página como também quando troco a seleção do meu selectonemenu, será que fiz algo errado aqui ?

package com.br.Beans;

import com.br.Classes.Cliente;
import com.br.Classes.Empresa;
import com.br.Persistencia.ClienteBD;
import com.br.Persistencia.EmpresaBD;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpSession;


@Named("VendaMain")
@SessionScoped
public class VendaMainBean implements Serializable{
    private Empresa empresaSelecionada;
    private Cliente clienteSelecionado = new Cliente();
    private List<Empresa> listaEmpresas = new ArrayList<Empresa>();
    private List<Cliente> listaClientes = new ArrayList<Cliente>();
    private EmpresaBD persistenciaEmpresa = new EmpresaBD();
    private ClienteBD persistenciaCliente = new ClienteBD();
    
    public void CarregarTela(){
        if (hasRequestParameter()){
            try{
                this.listaEmpresas = persistenciaEmpresa.selecionar();
                this.listaClientes = persistenciaCliente.selecionar();
            }catch(Throwable ex){

            }
        }
    }
    
    public static boolean hasRequestParameter() {  
        return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterNames().hasNext();  
    }  
    
    public void PegarClientes (){
        this.listaClientes.clear();
        if (this.empresaSelecionada != null){
            Cliente condicaoRetorno = new Cliente();
            condicaoRetorno.setEmpresa(new Empresa());
            condicaoRetorno.setEmpresa(this.empresaSelecionada);
            try {
                this.listaClientes = this.persistenciaCliente.selecionarClientesEmpresas(condicaoRetorno);
            } catch (Throwable ex) {
            }
        }else{
            try{
                this.listaClientes = this.persistenciaCliente.selecionar();
            }catch(Throwable ex){
                
            }
        }
    }
    
    public Empresa getEmpresaSelecionada() {
        return empresaSelecionada;
    }

    public void setEmpresaSelecionada(Empresa empresaSelecionada) {
        this.empresaSelecionada = empresaSelecionada;
    }
       
    public Cliente getClienteSelecionado() {
        return this.clienteSelecionado;
    }

    public void setClienteSelecionado(Cliente clienteSelecionado) {
        this.clienteSelecionado = clienteSelecionado;
    }

    public void PreencherClientes(){
        
        
    }
    
    public List<Empresa> getListaEmpresas() {
        return listaEmpresas;
    }

    public void setListaEmpresas(List<Empresa> listaEmpresas) {
        this.listaEmpresas = listaEmpresas;
    }

    public List<Cliente> getListaClientes() {
        return listaClientes;
    }

    public void setListaClientes(List<Cliente> listaCliente) {
        this.listaClientes = listaCliente;
    }
    
    public String AbrirVenda(){
        String retorno;
        if (this.clienteSelecionado == null){
            retorno = "";
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selecione um cliente", "" );
            FacesContext.getCurrentInstance().addMessage(null, message);
        }else{
            HttpSession sessaoVenda = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
            sessaoVenda.setAttribute("VendaSessao", this.clienteSelecionado);
            retorno = "VendaAbrir.xhtml";
        }
        return retorno;
    }
    
}
<?xml version='1.0' encoding='UTF-8' ?>
<!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">
    <h:head>
        <title>Agenda Web - Venda</title>
    </h:head>
    <h:body>
        <p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();"/> 
        <p:dialog modal="true" widgetVar="statusDialog" header="Carregando ..." width="250"  
                  draggable="false" closable="false">  
            <p:graphicImage name="progressbar.gif" library="icones"/>  
        </p:dialog>
        <h:form id="FormVenda">
            <p:growl id="messages" /> 
            <p:panel id="panel"> 
                <h:panelGrid columns="3" cellpadding="5"> 
                    <f:metadata>
                            <f:event type="preRenderView" listener="#{VendaMain.CarregarTela}"/>
                    </f:metadata>

                    <h:outputLabel value="Empresas :" for="lblEmpresa" id="lblEmpresa"/>
                    <p:selectOneMenu value="#{VendaMain.empresaSelecionada}"
                                     valueChangeListener="#{VendaMain.PegarClientes}"
                                     converter="ConversorEmpresa"
                                     id="cbxEmpresa">
                        <f:selectItem itemLabel="Todos" itemValue="#"/>
                        <f:selectItems value="#{VendaMain.listaEmpresas}"
                                       var="empresas"
                                       itemValue="#"
                                       itemLabel="#{empresas.nome}"/>
                        <p:ajax process="cbxEmpresa, cbxCliente" event="change" update="cbxEmpresa, cbxCliente" listener="#{VendaMain.PegarClientes}"/>
                    </p:selectOneMenu>
                    <br></br>
                    <h:outputLabel value="Clientes :" for="lblCliente" id="lblCliente"/>
                    <p:selectOneMenu value="#{VendaMain.clienteSelecionado}"
                                     converter="ConversorCliente"
                                     id="cbxCliente">
                        <f:selectItem itemLabel="Selecione um cliente" itemValue="#"/>
                        <f:selectItems value="#{VendaMain.listaClientes}"
                                       var="clientes"
                                       itemValue="#"
                                       itemLabel="#{clientes.nome}"/>
                    </p:selectOneMenu>
                    <p:commandButton value="Abrir Venda" action="#{VendaMain.AbrirVenda}" update="messages"
                                     onclick='javascript:return confirm("Deseja realmente abrir uma nova venda ?");'/>
                </h:panelGrid>
            </p:panel>
        </h:form>
        <h:outputLink value="Index.xhtml">Menu principal</h:outputLink>
    </h:body>
</html>


Responder

Gostei + 0

10/07/2013

Okabe Rintarou

Entendo. Minha estratégia só funcionaria se você estivesse chamando o link "por fora". Como a primeira chamada está dentro de:
    <f:metadata>  
                                <f:event type="preRenderView" listener="#{VendaMain.CarregarTela}"/>  
                        </f:metadata>  
Já haverá parametros. Cara, faça o seguinte (teste): 1) Crie um campo oculto. (inputHidden) e sete um valor, tipo 0. 2) No evento onLoad do body, vc seta o valor do inputHidden para 1. (via javascript); Veja, entre uma ação e outra o CarregarTela será invocado. Nas próximas invocações o inputHidden estará com valor 1 e ai vc valida isso e não executa mais a busca. Ou seja, na primeira chamada, o valor será 0. Depois que a página for carregada no cliente, um evento javascript irá alterar o valor para 1, e nas próximas chamadas AJAX dentro da página, o valor será sempre 1.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar