[JSF] Como se comporta um selectOneMenu

2 respostas
diego_arruda

Olá pessoal, eu estou estudando JSF e estou com algumas dificuldades. Eu li algumas referências de JSF, mas não encontrei nada falando a respeito do comportamento dos componentes (agradeço quem indicar alguma referência).

Pois bem, meu problema está na submissão de um formulário que contém uma combobox (selectOneMenu), utilizando o escopo “request”.

Na hora da submissão, o JSF tenta recarregar novamente o combobox (pra quê?), mas os atributos estão null, então dá um erro pois minha lista é conseguida através de outro componente. Na entrada não dá erro, pois a página que submeteu envia esse atributo, e por isso consigo capturar a lista.

Consigo resolver esse problema utilizando o escopo “session” ou manualmente fazer o controle de exibição com a propriedade “rendered”, mas não queria fazer destes modos pois acho que tem uma maneira mais fácil de fazer. Quero saber mesmo é o por quê a página tenta preencher novamente o combobox já que estou saindo dela e o mesmo não irá ser exibido.

abaixo está trechos do meu código para facilitar o entendimento, qualquer dúvida e esclarecimentos, é só perguntar.

Página JSP que irá ser exibido o combo

<h:inputHidden value="#{inscricao.concursoID}" />
<h:selectOneMenu value="#{inscricao.cargoID}" rendered="true">
	<f:selectItems value="#{inscricao.cargos}" />
</h:selectOneMenu>
<h:commandButton action="#{inscricao.cadastrar}" value="Salvar Dados" />

Métodos e atributos do meu bean

private Integer concursoID;
private Integer cargoID;
private Concurso concurso;

public Concurso getConcurso() {
	if (concurso == null) {
		Fachada fachada = Fachada.getInstance();
		concurso = fachada.findConcursoById(concursoID);
	}
	return concurso;
}

public List<SelectItem> getCargos() {
	Concurso concurso = getConcurso();
	if (concurso != null) {
		return concurso.getCargos();
	} else {
		return new ArrayList<SelectItem>(); //Lista vazia
	}
}

public String cadastrar() {
	try {
		Fachada fachada = Fachada.getInstance();
		Concurso concurso = getConcurso();
		Cargo cargo = fachada.findCargoById(cargoID)
		Inscricao i = new Inscricao();
		i.setCargo(cargo);
		i.setConcurso(concurso);
		fachada.saveInscricao(i);
	} catch (PersistenceException e) {
		return "fail";
	}
	return "sucess";
}


// get e set para concursoID e cargoID...

faces-config.xml

<managed-bean>
	<managed-bean-name>inscricao</managed-bean-name>
	<managed-bean-class>action.InscricaoAction</managed-bean-class>
	<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

2 Respostas

afamorim

Meu velho, não estou com o codigo aqui, mais vc poder fazer de duas maneiras.

Procure a tag saveState, vc salva o state dos 2 combos.
Outra maneira é vc no seu metodo que faz com que a pagian de refresh trate para que os combos venham preechidos como estavm anteriormente.

o savestate vc vai ter que usar para utilizar paginação do dataTable.

diego_arruda

obrigado afamorim, o savestate funcionou como uma luva.

Pois bem, fica ainda a dúvida quanto ao comportamento do componente, vi que ao salvar o estado da combobox, ela é armazenada em algum lugar (seja na session ou num campo hidden) e depois repopulada no submit.

Não endendi direito a solução 2, poderia explicar melhor? No meu método, antes mesmo de entrar nele o jsf tenta repopular a combo, queria saber o por quê já que não estou dando um refresh na tela e sim um submit. Se estivesse utilizando um actionListener tudo bem, mas é uma action, a página será redirecionada.

Como trataria isso, sobrepondo algum método da UIComponent?

Obrigado

Criado 4 de dezembro de 2006
Ultima resposta 5 de dez. de 2006
Respostas 2
Participantes 2