[JSF] - Listar dados numa combo

Olha, tem uns 2 dias que estou procurando como fazer isso e não estou achando. Eu preciso que que a combo tenha 2 comportamentos:

  1. quando carregar a tela, ela fica selecionada no item setado no bean
  2. Quando eu modificar o valor do ComboBox, ele dá um submit e renderiza a página com os novos dados.

Mas não estou conseguindo fazer isso. Sempre que a página é renderizada, os combos ficam mostrando os primeiros valores (o que não é correto), e quando altero o valor dos combos, a pagina fica inerte.

bom, o meu código JSF para esse combo é:

 <h:outputText value="Mes: "/>
     <h:selectOneMenu id="sMes" value="#{AtbBack.mesIni}" immediate="#{AtbBack.mesIni}" onchange="javascript:atualizar()">
     <f:selectItems value="#{AtbBack.listaMes}"/>
     </h:selectOneMenu>
     <h:outputText value="Ano: "/>
     <h:selectOneMenu id="sAno" value="#{AtbBack.anoAtual}" onchange="javascript:atualizar()" >
     <f:selectItems value="#{AtbBack.listaAno}" />
     </h:selectOneMenu>

Como eu posso resolver isso?

Cara quanto ao problema do submit, no evento onChange da tua combo, coloque um “javascript:submit();”. Quanto ao outro teria que dar uma olhada com mais calma

O do submit funcionou

No caso do primeiro problema, a construção está correta, você só tem que se certificar que o valor retornado na expressao {AtbBack.mesIni} é igual ao VALUE de um dos selectItems no array {AtbBack.listaMes}

Só essa parte do immediate="#{AtbBack.mesIni}" que eu achei estranho, não consegui identificar o motivo de o valor Mês estar atribuido ao atributo Immediate.

A tá! A parte do immediate foi só um teste que eu fiz. Mas já tirei do código.

Ok, quanto ao valor do mesIni, sim, o valor existe. pq eu faço assim, os valores que são mostrados no combo são apenas os valores possíveis.

Bom, agora descobri a fonte do problema. O selectOneItem simplesmente não seta o backbean com os valores selecionados pelo usuário. Bom, como eu faço isso?

Adiantando, eu fiz um código assim:

declarei as váriáveis mesIni e Anoatual, criei os getteres e setteres, e criei um método que processa as informações.

Bom, fazendo uns testes eu coloquei um commandButton e no action dele eu chamei esse método que realmente processa as infomações.

Pelo que eu li sobre JSF, o JSF processa os métodos get no request e processa os métodos set no submit. Só que eu acho que, ou JSF não está processando nada, ou não está envovando nenhum método set.

o que pode está errado?

Vou colocar uns fragmentos do meu código:
JSF

 <f:view>
            <h:form id="frm">
                <h:outputText value="Mes: "/>
                <h:selectOneMenu id="sMes" value="#{AtbBack.mesIni}" >
                    <f:selectItems value="#{AtbBack.listaMes}"/>
                </h:selectOneMenu>
                <h:outputText value="Ano: "/>
                <h:selectOneMenu id="sAno" value="#{AtbBack.anoAtual}"  >
                    <f:selectItems value="#{AtbBack.listaAno}" />
                </h:selectOneMenu>
                <h:commandButton immediate="true" value="Visualizar" type="submit" action="#{AtbBack.listar}"/>
                <h:dataTable rendered="#{! empty AtbBack.atbGeral}" value="#{AtbBack.atbGeral}" var="atb">
                    <h:column>
                        <f:facet name="header"><h:outputText value="Super"/></f:facet>
                        <h:outputText value="#{atb.CD_PRF_DEPE_JRDT}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Pref."/></f:facet>
                        <h:outputText value="#{atb.CD_PRF_DEPE}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Dependência"/></f:facet>
                        <h:outputText value="#{atb.NM_DEPE}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Resultado Econômico"/></f:facet>
                        <h:outputText value="#{atb.RESULTADO_ECONOMICO_SMT}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Estratégia e Operações"/></f:facet>
                        <h:outputText value="#{atb.ESTRATEGIA_OPERACOES_SMT}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Clientes"/></f:facet>
                        <h:outputText value="#{atb.CLIENTES_SMT}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Processos Internos"/></f:facet>
                        <h:outputText value="#{atb.PROCESSOS_INTERNOS_SMT}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Comportamento Organizacional"/></f:facet>
                        <h:outputText value="#{atb.COMPORTAMENTO_ORGANIZACIONAL_SMT}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Bônus Estratégico"/></f:facet>
                        <h:outputText value="#{atb.BONUS_ESTRATEGICO_PTO}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="DRS"/></f:facet>
                        <h:outputText value="#{atb.SOCIEDADE_PTO}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header"><h:outputText value="Placar"/></f:facet>
                        <h:outputText value="#{atb.TOTAL_PTO}"/>
                    </h:column>
                </h:dataTable>
            </h:form>
        </f:view>

Java

/*
 * Controle.java
 *
 * Created on 21 de Junho de 2007, 09:14
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.com.bb.sigov.atb;

import java.lang.*;
import java.util.*;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
/**
 *
 * @author f9343091
 */
public class AtbBack
{
    private Atb atb = null;
    private ListDataModel atbGeral = null;
    
    private int jrdt;
    private int espd;
    private int depe;
    private int anoAtual;
    private int mesIni;
    private int mesFim;
    private Meses [] listaMes = null;
    private Anos [] listaAno = null;
    
    
    /** Creates a new instance of Controle */
    public AtbBack()
    {
        setAtb(new Atb());
        mesIni = mesFim = new Meses().getMM_REF();
        anoAtual = new Anos().getAA_REF();
        mesIni = 3;
    }
    //---------------- Setters and getters -------------------------------------
    
    //--------------------------------------------------------------------------
    //--------------------------------------------------------------------------
    public ListDataModel getAtbGeral ()
    {
        return atbGeral;
    }
    public void listar()
    {
        AtbBeans [] rsAtb = null;
        ArrayList<AtbGeralBean> vtPreparado = new ArrayList();
        AtbGeralBean atbG = new AtbGeralBean();
        System.out.println("Ano: " + getAnoAtual() + " -  Mês: " + getMesIni() );
        rsAtb = atb.atbResultado("AbtGeral", getDepe(), getEspd(), getAnoAtual(), getMesIni(), getMesFim());
        for (int i = 0; i < rsAtb.length-16; i+=8)
        {
            atbG = new AtbGeralBean();
            
            atbG.setCD_PRF_DEPE( rsAtb[i].getCD_PRF_DEPE() );
            atbG.setCD_PRF_DEPE_JRDT( rsAtb[i].getCD_PRF_DEPE_JRDT() );
            atbG.setNM_DEPE( rsAtb[i].getNM_DEPE() );
            ...
            atbG.setTOTAL_PTO( rsAtb[i+7].getPTO() );
            
            vtPreparado.add( atbG );
        }
        atbGeral = new ListDataModel(vtPreparado);
        //return atbGeral;
    }
    //--------------------------------------------------------------------------
    //--------------------------------------------------------------------------
    //--------------------------------------------------------------------------

    public void setAtb(Atb atb)
    {
        this.atb = atb;
    }

    public int getJrdt()
    {
        return jrdt;
    }

    public void setJrdt(int jrdt)
    {
        this.jrdt = jrdt;
    }

    public int getEspd()
    {
        return espd;
    }

    public void setEspd(int espd)
    {
        this.espd = espd;
    }

    public int getDepe()
    {
        return depe;
    }

    public void setDepe(int depe)
    {
        this.depe = depe;
    }

    public ArrayList<SelectItem> getListaAno()
    {
        if (listaAno == null)
            setListaAno();
        ArrayList<SelectItem> vtAno = new ArrayList();
        for (int i = 0; i < listaAno.length; i++)
            vtAno.add( new SelectItem( String.valueOf(listaAno[i].getAA_REF()),String.valueOf(listaAno[i].getAA_REF()) ) );
        return vtAno;
    }

    public void setListaAno()
    {
        this.listaAno = atb.anoAtb();
    }

    public int getMesIni()
    {
        return mesIni;
    }

    public void setMesIni(int mesIni)
    {
        if ( mesIni > listaMes[listaMes.length - 1].getMM_REF() )
            mesIni = listaMes[listaMes.length - 1].getMM_REF();
        this.mesIni = mesIni;
    }

    public int getMesFim()
    {
        return mesFim;
    }

    public void setMesFim(int mesFim)
    {
        this.mesFim = mesFim;
    }

    public int getAnoAtual()
    {
        return anoAtual;
    }

    public void setAnoAtual(int anoAtual)
    {
        this.anoAtual = anoAtual;
    }
    public void setListaMes()
    {
        listaMes = atb.mesAtb( anoAtual );
    }
    public ArrayList<SelectItem> getListaMes()
    {
        ArrayList<SelectItem> vlMes = new ArrayList();
        if (listaMes == null)
            setListaMes();
        for (int i = 0; i< listaMes.length;i++)
            vlMes.add( new SelectItem(listaMes[i].getNM_MES(),String.valueOf(listaMes[i].getMM_REF()) ) );
        return vlMes;
    }
}