Como eu faço para pegar o valor do h:selectOneMenu assim que carregar a página?
Tenho uma lista que será populada em relação ao conteúdo do combo e não quero ter que incluir um item “Selecione…” para fazer o evento onchange de inicio.
Como eu faço para pegar o valor do h:selectOneMenu assim que carregar a página?
Tenho uma lista que será populada em relação ao conteúdo do combo e não quero ter que incluir um item “Selecione…” para fazer o evento onchange de inicio.
Essa lista que será populada em relação ao combo, a lista de valores do combo e a que será populada estão no mesmo managed bean?
Sim Guilherme! Estão no mesmo MB
Aqui está a solução que acabei encontrando…
Mas achei meio… “Gambiarra” rs
Veja lá no código onde mostro isso.
Na minha concepção, o mais correto seria pegar do combo que já está preenchido. Me corrija se eu estiver errado.

xhtml
<div class="filtro">
<h:selectOneMenu value="#{listaMensageiroMB.mensageiro.idmensageiro}">
<f:selectItems value="#{listaMensageiroMB.lstTipos}" var="tipo"
itemValue="#{tipo.idtipomensageiro}" itemLabel="#{tipo.nome}"></f:selectItems>
<f:ajax listener="#{listaMensageiroMB.changeLista}"
render="lista_mensagens"></f:ajax>
</h:selectOneMenu>
</div>
<h:dataTable id="lista_mensagens"
value="#{listaMensageiroMB.lstMensageiro}" var="mensagem"
class="table table-hover table-nomargin dataTable table-bordered"
columnClasses="align_left col_data,align_left,col_del">
<h:column>
<f:facet name="header">Data Inclusão</f:facet>
<h:outputText value="#{mensagem.datacadastro}">
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">Título</f:facet>
<h:commandLink value="#{mensagem.titulo}">
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header"></f:facet>
<h:commandLink class="bt_excluir" value="Excluir"
onclick="return window.confirm('Deseja realmente excluir?')">
</h:commandLink>
</h:column>
</h:dataTable>
MB
@EJB
private MensageiroFacadeRemote mensageiroFacade;
@EJB
private TipoMensageiroFacadeRemote tipoMensageiroFacade;
private Mensageiro mensageiro;
private List<Mensageiro> lstMensageiro;
private List<TipoMensageiro> lstTipos;
@PostConstruct
public void init(){
mensageiro = new Mensageiro();
lstTipos = tipoMensageiroFacade.findAll();
//AQUI A GAMBI. PRA PEGAR O PRIMEIRO ITEM DO COMBO.
TipoMensageiro tipoGet = lstTipos.get(0);
lstMensageiro = mensageiroFacade.findByTipo(tipoGet.getIdtipomensageiro());
}
public void changeLista(AjaxBehaviorEvent event){
int idtipo = (int)event.getComponent().getAttributes().get("value");
lstMensageiro = mensageiroFacade.findByTipo(idtipo);
}
//get and setters
Não é gambiarra irmão. Você provavelmente no DAO fez a buscar com os critérios desejados e ordenados para aparecer no selectOneMenu. Logo é logico que a posição 0 será o selecionado do select ao carregar a pagina então você precisa ter o dataTable populado com o conteudo do select iniciado.
Não sei se entendi direito , mas o que pode ser feito sem gambiarra é antes de carregar a pagina setar a variável do atributo “value” do componente com o valor que você quer que apareça de inicio.
Resumindo:
No xhtml
<h:selectOneMenu value="#{listaMensageiroMB.mensageiro.idmensageiro}">
...
No Bean antes de carregar a pagina:
this.mensageiro = new Mensageiro();
this.mensageiro.setIdMensageiro(1);
this.mensageiro.setNome("biancuzzi");
Eu acredito que vai funcionar, pois normalmente eu faço isso, sendo que nos meus casos eu trabalho com objetos já populados (e usando o converter) e quando o objeto setado no “value” já está populado ele já é selecionado automaticamente no carregamento da página. Então eu acredito que funcione no seu caso também.
Abcs,
Gustavo