JSF - selectOneMenu -> Carregar a pagina com um item selecionado

8 respostas
M

Olá…

Gostaria de saber como faço para carregar uma tela com um valor do selectOneMenu carregado de acordo com o cadastro anterior.
O problema é que não sei quantos selectOneMenu tenho na tela.
Segue abaixo o meu código.

<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Editar viagem</title>
<link rel="stylesheet" type="text/css" href="css/common.css" />
</head>
<body>
<f:view>
	<a4j:form id="form">
		<rich:panel style="width : 1242px; height : 556px;">
			<f:facet name="header">
				<h:outputText value="Edição da viagem" />
			</f:facet>
			<br />
			Selecione a Viagem: <h:selectOneMenu id="listaRotas" value="#{editarViagem.rotaAtual}" valueChangeListener="#{editarViagem.onChangeRota}" immediate="true">
				<a4j:support ajaxSingle="true" event="onchange" reRender="form" />
				<f:converter converterId="rotaEditarConverter" />
				<f:selectItems value="#{editarViagem.lista}" />
			</h:selectOneMenu>&nbsp;&nbsp;&nbsp;
			<h:outputText id="status" value="#{editarViagem.texto}" style="color:red;font-size:12px" />
			<BR>
			<BR>
			<h:dataTable id="tblParadas" border="1" value="#{editarViagem.tableParadas}" var="rev" summary="Relação de Paradas" rendered="#{editarViagem.rotaAtual != null}" style="FONT-SIZE: small; width : 1173px; height : 79px;">
				<h:column>
					<f:facet name="header">
						<h:outputText value="Cliente:" />
					</f:facet>
					<h:outputText value="#{rev.cliente}" rendered="#{editarViagem.rotaAtual != null}"/>
				</h:column>
				<h:column>
					<f:facet name="header">
						<h:outputText value="Motorista:" />
					</f:facet>
					<h:selectOneMenu id="listaMotoristas" value="#{editarViagem.motoristaFiltro}" rendered="#{editarViagem.rotaAtual != null}" >
							<f:converter converterId="motoristaConverter" />
							<f:selectItems value="#{editarViagem.listaMotoristas}"  />  <!-- aqui preciso que venha preenchido o valor do cadastro -->
					</h:selectOneMenu>
				</h:column>
				<h:column>
					<f:facet name="header">
						<h:outputText value="Alterar" />
					</f:facet>
					<h:commandButton action="#{editarViagem.salvar}" value="Alterar"  rendered="#{editarViagem.rotaAtual != null}" />
				</h:column>
			</h:dataTable>
		</rich:panel>
		<rich:messages id="msg" style="color:Red;font-size:13px;font-family:Arial;width : 1249px; height : 92px;">
		</rich:messages>
	</a4j:form>
</f:view>
</body>
</html>

Meu Bean:

/*imports omitidos*/
public class EditarViagemBean {

	private List<Parada> listaParadas;
	private String texto;
	private List<Rota> listaRota = new ArrayList<Rota>();
	private List<SelectItem> lista = new ArrayList<SelectItem>();
	private Rota rotaAtual;
	private DataModel tableParadas;
	private Date dataFiltro = new Date();
	private String carretaAtual;

	private Parada parada;
	private ParadaSE paradaSE;
	private RotaSE rotaSE;

	private MotoristaSE motoristaSE;
	private List<Motorista> motoristas;
	private List<SelectItem> listaMotoristas = new ArrayList<SelectItem>();
	private String motoristaId;
	private Motorista motoristaFiltro;

	public EditarViagemBean() {
		try {
			rotaSE = new RotaSE();
			rotaSE.iniciar();
			paradaSE = new ParadaSE();
			paradaSE.iniciar();
			motoristaSE = new MotoristaSE();
			motoristaSE.iniciar();
			if (lista.size() == 0)
				atualizaListaRota();
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage("",
					new FacesMessage("Erro ao atualizar lista de viagem"));
		}
	}

	/**
	 * Lista de motoristas
	 */
	public void atualizaListaMotoristas() {
		try {
			setMotoristas(motoristaSE.getAllMotoristas());
		} catch (Exception e) {
			setListaMotoristas(new ArrayList<SelectItem>());
			return;
		}
		getListaMotoristas().clear();
		for (Motorista m : getMotoristas()) {
			getListaMotoristas().add(new SelectItem(m, m.getNome()));
		}
	}

	
	/**
	 * obtem relacao de viagens ativas
	 */
	public void atualizaListaRota() throws OriginalException {
		setListaRota(rotaSE.getRotasEditar(getDataFiltro()));

		getLista().clear();
		getLista().add(new SelectItem(null, "** Selecione **"));

		if (getListaRota().size() > 0) {
			for (int i = 0; i < getListaRota().size(); i++) {
				Rota rota = getListaRota().get(i);
				getLista().add(new SelectItem(rota, rota.getId()));
			}
			setTexto("");
		} else {
			setTexto("Não foram encontradas viagens!");
		}
	}

	public void filtrar() {
		try {
			atualizaListaRota();
		} catch (Exception ex) {
			FacesContext.getCurrentInstance().addMessage("",
					new FacesMessage(ex.getMessage()));
		}
	}

	public void onChangeRota(ValueChangeEvent e) {
		setRotaAtual((Rota) e.getNewValue());
		escolher();
	}

	/**
	 * obtem relacao de paradas da rota selecionada.
	 */
	private void getParadasPorRota() throws OriginalException {
		atualizaListaMotoristas();
		atualizaListaVeiculos();
		setListaParadas(paradaSE.getAllParadasPorRota(getRotaAtual().getId(),
				true));
		setTableParadas(new ListDataModel(getListaParadas()));
	}

	/**
	 * Salvar os niveis e o descarregado das paradas.
	 */
	public void salvar() {
		try {
			setParada((Parada) getTableParadas().getRowData());
			getParada().setStatus(1);
			paradaSE.editaRota(getParada());
		} catch (OriginalException e) {
			e.printStackTrace();
		}
	}

	/**
	 * obtem rota selecionada, exibe detalhes e carrega paradas respectivas
	 */
	public void escolher() {
		if (getRotaAtual() != null) {
			try {
				setTexto("Viagem Selecionada : " + getRotaAtual().getId());
				getParadasPorRota();
			} catch (OriginalException e) {
				setTexto("Erro ao obter as paradas");
				e.printStackTrace();
			}
		} else {
			setTexto("Por favor selecione uma rota válida!");
		}
	}

/*gets e sets omitidos*/

}

Se alguém puder me ajudar…

obrigada

8 Respostas

F

Se o valor do atributo do bean que está indicado no value do SelectOne estiver com um valor que estiver em algum option, ele virá selecionado.

M

Eu tentei assim:

<h:selectOneMenu id="listaMotoristas" value="#{rev.motorista.id}" rendered="#{editarViagem.rotaAtual != null}" >
							<f:converter converterId="motoristaConverter" />
							<f:selectItems value="#{editarViagem.listaMotoristas}"  />
					</h:selectOneMenu>

E mesmo assim num funcionou :frowning:
O que to fazendo errado!

E

Cara, no lugar desse “rev.motorista.id”, você tem que colocar o nome do seu bean mapeado e o nome do atributo. E nesse “editarViagem.listaMotoristas” tambem tem que ter o nome do bean.

M

Mas não sei exatamente quantos combos eu vou ter… ele fica dentro de uma tabela dinamica… :frowning:

F

O value tem que ter um atributo ou metodo que retorne um valor do BackingBean. Você tem duas alternativas ou você popula esses atributos no Construtor do BackingBean, ou encapsula isso em um get e popula nesse momento. Faz um teste pra vc ver, fixa um valor no atributo e faz o teste.

M

Para um combo especifico eu consigo fazer isso.
Agora para varios e com uma quantidade indefinida que não sei como fazer.
:frowning:

F

Mesma coisa, o value vai ser um elemento de uma Collection. Vc precisa retornar do Bean essa collection com os valores já “setados”. Encapsula essa Collection Motorista, e popula ela com os valores já. Vai Rolar.

F

Bom dia.

Tenho um combo e o value esta setado porem ocorre o mesmo erro, não seta o valor no combo alguem sabe como resolver?

private General general;

public void populateCombosViewIncluir() {

		this.general = (General) dt.getRowData();

		List<Synonymdomain> listStatus = getStatusOs();
		Iterator<Synonymdomain> it = listStatus.iterator();

		String[] synonymsImport = new String[] { "CAN", "CLOSE", "APPR",
				"HISTEDIT", "WAPPR" };
		List<String> listSynonymsImport = new ArrayList<String>(Arrays
				.asList(synonymsImport));

		while (it.hasNext()) {
			Synonymdomain synonymdomain = (Synonymdomain) it.next();

			if (listSynonymsImport.contains(synonymdomain.getMaxvalue()))
				itensImport.add(new SelectItem(synonymdomain.getValue(),
						synonymdomain.getValue()));

			if (synonymdomain.getMaxvalue().equals("INPRG"))
				itensConcl.add(new SelectItem(synonymdomain.getValue(),
						synonymdomain.getValue()));

			if (synonymdomain.getMaxvalue().equals("APPR")) {
				itensAprv.add(new SelectItem(synonymdomain.getValue(),
						synonymdomain.getValue()));
			}

			if (synonymdomain.getMaxvalue().equals("WAPPR"))
				itensAprvOS.add(new SelectItem(synonymdomain.getValue(),
						synonymdomain.getValue()));
		}
	}

O general bean é De Request e o General de Sessão

<managed-bean>
 	<managed-bean-name>generalBean</managed-bean-name>
 	<managed-bean-class>com.sigga.managedbean.GeneralBean</managed-bean-class>
 	<managed-bean-scope>request</managed-bean-scope>
 </managed-bean>

<managed-bean>
 	<managed-bean-name>general</managed-bean-name>
 	<managed-bean-class>com.sigga.common.map.General</managed-bean-class>
 	<managed-bean-scope>session</managed-bean-scope>
 </managed-bean>

TELA

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>

<body>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:rich="http://richfaces.org/rich"
	  xmlns:a4j="http://richfaces.org/a4j"
      xmlns:ui="http://java.sun.com/jsf/facelets">
	
	<h:form id="formEditarGeral">
	
	<rich:modalPanel id="pnlEditarGeral"  width="450" autosized="true">
		<f:facet name="header">
			<h:panelGroup>
				<h:outputText value="Editar Geral"></h:outputText>
			</h:panelGroup>
		</f:facet>
		<f:facet name="controls">
			<h:panelGroup>
					<h:graphicImage value="/images/close.png" id="hidelink" onclick="Richfaces.hideModalPanel('pnlEditarGeral')"/>
			</h:panelGroup>
		</f:facet> 
		<h:panelGrid columns="6" style="padding-right: 100%;" cellpadding="5" cellspacing="5">
		
		<h:panelGrid columns="1" style="font-size: 10px; font-family: Arial;" cellspacing="10">
			<h:outputText value="Importação"/>
			
			<h:selectManyListbox id="selectStatusOS" label="Lista de Status" title="Lista de Status" size="10" 
			style="font-size: 10px; font-family: Arial;" value="#{generalBean.general.statusImport}">
			
			<f:selectItems value="#{generalBean.itensImport}" id="itensStatusOS"/>			
			</h:selectManyListbox>
			
		</h:panelGrid>
		
		<h:panelGrid columns="1" style="font-size: 10px; font-family: Arial;" cellspacing="10">
		<h:outputText value="Conclusão"/>
		<h:selectOneMenu id="comboConcl"
		style="font-size: 10px; font-family: Arial;" value="#{generalBean.general.statusConcl}">
			<f:selectItems id="si1" value="#{generalBean.itensConcl}"/>
		</h:selectOneMenu>
		</h:panelGrid>
		
		<h:panelGrid columns="1" style="font-size: 10px; font-family: Arial;" cellspacing="10">
		<h:outputText value="Aprovada"/>
		<h:selectOneMenu id="comboAprv" style="font-size: 10px; font-family: Arial;"
		 value="#{generalBean.general.statusAprv}">
			<f:selectItems id="si2" value="#{generalBean.itensAprv}" />
		</h:selectOneMenu>
		</h:panelGrid>
		
		<h:panelGrid columns="1" style="font-size: 10px; font-family: Arial;" cellspacing="10">
		<h:outputText value="Aprovar Os"/>
		<h:selectOneMenu id="comboAprvOs" style="font-size: 10px; font-family: Arial;"
		value="#{generalBean.general.statusServico}">
			<f:selectItems id="si4" value="#{generalBean.itensAprvOS}" />
		</h:selectOneMenu>
		</h:panelGrid>
		</h:panelGrid>
			
		<table width="100%" align="center">
		<tr>
		<h:commandButton value="Salvar" id="btnSalvar" onclick="Richfaces.hideModalPanel('pnlEditarGeral')" action="#{generalBean.edit}" style="font-size: 10px; font-family: Arial;"/>		
		<h:commandButton value="Fechar" id="btnFechar" onclick="Richfaces.hideModalPanel('pnlEditarGeral')" style="font-size: 10px; font-family: Arial;"/>
		</tr>
		</table>
		</rich:modalPanel>
	</h:form>		
	</ui:composition>
	</body>
</html>
Criado 15 de abril de 2010
Ultima resposta 8 de jun. de 2010
Respostas 8
Participantes 4