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:
- quando carregar a tela, ela fica selecionada no item setado no bean
- 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
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;
}
}