JSF - valor do SelectOneMenu no onload da página

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.
:wink:

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