Bom dia amigos, Feliz natal para todos …
Como faço para selecionar um valor em uma combo… tipo tenho uma pagina de alteração de clientes, quando vou para a pagina de alteração do cliente X, existe uma combo que é populada com os valores vindo do bd, mas como faço para esta combo aparecer com o o estado deste cliente, que foi o estado cadastrado para este cliente… Alguém tem uma opnião ???
Estou usando o codigo abaixo no JSP:
<select name="endereco.uf" id="id" size="1">
<c:forEach var="estado" items="${lEstado}">
<option value="<c:out value="${estado.id}"/>"><c:out value="${estado.nome}"/></option>
</c:forEach>
</select>
Você deve colocar um <c:if testando o valor do valor do estado que está gravado na tabela cliente. Exemplo:
<select name="endereco.uf" id="id" size="1">
<c:forEach var="estado" items="${lEstado}">
<option value="<c:out value="${estado.id}"/>" <c:if test="${estado.id eq cliente.idEstado}"> selected="true"</c:if> <c:out value="${estado.nome}"/></option>
</c:forEach>
</select>
Não tem erro. Se tiver alguma dúvida posta aí.
[]´s
Sávio
Savio, me surgiu uma dúvida: você pega os valores de um java bean? 
Olá,
Eu costumo fazer o seguinte:
- Jogar os valores do Java Bean para o Backing Bean JSF (ou action struts 2)
- Em seguida mapear os campos da página para os campos do Backing Bean JSF (ou action Struts 2)
Há quem faça o bind direto da página jsp para o Java Bean. Eu particularmente não gosto muito.
[]'s
Sávio
Estou tentando da forma q vc postou, mas o estado do cliente não fica selecionado na cambo. Parece que o if não funfa. O que pode ser?
O valor dos 2 atributos (estado.id e endereco.uf) são do mesmo tipo, ou seja, estão sendo comparados como String. Tem algum problema comparar 2 strings ?
<select name="endereco.uf" id="id" size="1">
<c:forEach var="estado" items="${lEstado}">
<option value="<c:out value="${estado.id}"/>"><c:if test="${estado.id eq endereco.uf}">selected="true"</c:if><c:out value="${estado.nome}"/></option>
</c:forEach>
</select>
Vlw…
Seguinte, o estado é a sigla, e o UF no cliente é a sigla tb, certo?
Seguinte, vc debugou para ver se o valor do estado do cliente está contigo na lista de estados?
Na lista lEstado o atributo estado.id e na lista lCliente endereco.uf são os ID’S do estado e estes atributos estão sendo preenchidos corretamente com os valores ID’S dos estados…
Já debuguei estes atributos, mas vou verificar novamente pra ter certeza… mas existe algo que devo verificar?
Vlw…
[quote=IgorFranco]Na lista lEstado o atributo estado.id e na lista lCliente endereco.uf são os ID’S do estado e estes atributos estão sendo preenchidos corretamente com os valores ID’S dos estados…
Já debuguei estes atributos, mas vou verificar novamente pra ter certeza… mas existe algo que devo verificar?
Vlw…[/quote]
Basicamente se o valor uf em cliente está contido na lista de estados… não tem pq não funcionar…
Amigo, descobrir que dentro do <c:forEach> o atributo endereco.uf aparece como nulo, explicando o porque que não funciona o if, mas este atributo da lista é populado com a sigla do estado (ex. RJ, SP)… resolvi colocar este atributo fora do <c:forEach> para ver qual valor aparecia e ai entao apareceu o a sigla do estado do cliente X. Não sei porque este atributo fica nulo dentro do <c:forEach>… alguém tem alguma sugestão?
Fixei o valor do endereco.uf no if, para teste, e assim funfou…
<c:if test="${estado.nome eq 'RJ'}">selected</c:if>
Gostaria de opniões a respeito deste problema amigos…
Obrigado…
Opa, deixa ver se entendi: quando o teste fica fora do <c:forEach> funciona, mas quando fica dentro do <c:forEach> NÃO funciona. É isso?
Dentro do <c:forEach>: endereco.uf == null
Fora do <c:forEach>: endereco.uf == ‘RJ’ (ou outro estado do cliente)
Você está usando jsf ou struts? Talvez haja algum problema na hora de setar o valor do bean para sua página.
Digo que o endereco.uf, quando fica fora do <c:forEach> mostra o estado normalmente de acordo com a uf do cliente, mas quando coloco endereco.uf dentro do <c:forEach> para comparar com estado.nome (<c:if test="${estado.nome eq endereco.uf}">selected</c:if>), o endereco.uf fica com o valor em branco, não nulo como havia dito.
Se eu colocar o uf fixo (<c:if test="${estado.nome eq ‘RJ’}">selected</c:if>) dentro do <c:forEach>, funciona normalmente…
O endereco.uf é populado corretamente, só não fica com o valor dentro do <c:forEach>… O que pode ser?
Vlw…
Olha só, vc está usando Struts 2 ou JSF?
Certo, então na hora de alterar, vc recupera o endereco do banco e joga na sessao, certo? Em seguida usa JSTL para mostrar os valores de cada propriedade do objeto endereco jogado na sessao, certo? Eh que faz tempo que não trabalho com struts 1… só pra irmos eliminando possibilidades…
Isso. Por exemplo, nesta mesma pagina de alteração do cliente, no mesmo formulário, todos os dados são exibidos corretamente… mostro da seguinte forma no JSP:
<tr>
<td>
<div align="left" class="texto1">
<div align="right">Cidade:</div>
</div>
</td>
<td width="132">
<div align="left">
<html:text property="endereco.cidade" size="20" styleClass="text" />
</div>
</td>
</tr>
Neste codigo acima, mostro a cidade do cliente que estou alterando. Em um dos testes que fiz, substitui a propriedade (property=“endereco.cidade”) por (property=“endereco.uf”) e mostro a uf certinha do cliente que estava alterando.
Logo abaixo da cidade do cliente é que vem o estado, onde faço a combo na qual esta dando este probleminha de não selecionar o estado deste cliente, pois endereco.uf, dentro do <c:forEach> do da combo, ao invés de ter o valor do estado, ele fica em branco, então quando vou comparar:
<c:if test="${estado.nome eq endereco.uf}">selected</c:if>
como endereco.uf ta em branco, ele faz o seguinte:
<c:if test="${estado.nome eq ''}">selected</c:if>
compara com vazio e então não seleciona nada na combo.
Temos que saber porq que dentro do <c:forEach> da combo, endereco.uf fica sem valor…
<select name="endereco.uf" id="id" size="1">
<c:forEach var="estado" items="${lEstado}">
<option value="<c:out value="${estado.id}"/>"><c:if test="${estado.nome eq endereco.uf}">selected="true"</c:if><c:out value="${estado.nome}"/></option>
</c:forEach>
</select>
Sacou amigo ?
Obrigado pela atenção…
Vlw…
Vamos fazer um teste? Coloque o estado do cliente em um objeto de sessão separado e vamos tentar testar. Tipo session.setAttribute(“estado”, endereco.uf).
Em seguida coloque esse atributo (estado) dentro do <c:forEach> pra ver se ele exibe… não deve ficar assim, é só pra irmos cercando o problema e queimando possibilidades…
sávio
Amigo saviobarr,
Joguei o endereco.uf para uma session e depois joguei a session dentro do if do <c:forEach> para comparar e desta forma funfou, a session vem com o valor do estado do cliente que estou alterando no momento.
Fiz desta forma:
HttpSession session = request.getSession();
session.setAttribute("ufCliente", clienteVO.getEndereco().getUf());
E no JSP:
<select name="endereco.uf" id="id" size="1">
<c:forEach var="estado" items="${lEstado}"> <option value="${estado.id}"<c:if test="${estado.nome == ufCliente}">selected</c:if>>${estado.nome}</option>
</c:forEach>
</select>
Funcionou certinho. O que pode ser amigo?
Lembrando que tenho 3 classes VO: FornecedorVO, EnderecoVO e ContatoVO. Na classe FornecedorVO faço um relacionamento com as outras 2:
private EnderecoVO endereco = new EnderecoVO();
private ContatoVO contato = new ContatoVO();
E ai quando vou popular os atributos da classe EnderecoVO no DAO, tenho um método que faz um select e preenche os atributos do objeto e retorna o objeto cliente populado, conforme parte do codigo abaixo:
ClienteVO cliente = new ClienteVO();
while(xConn.rs.next()) {
cliente.getEndereco().setEndereco(xConn.rs.getString(9));
cliente.getEndereco().setBairro(xConn.rs.getString(10));
cliente.getEndereco().setCidade(xConn.rs.getString(11));
cliente.getEndereco().setUf(xConn.rs.getString(12));
cliente.getEndereco().setReferencia(xConn.rs.getString(13));
cliente.getEndereco().setObs(xConn.rs.getString(14));
}
Tenho certeza que endereco.uf é populado certinho, mas será que este problema tem alguma coisa com o relacionamento das classes ?
Acho que não… e vc?
Vlw… Obrigado amigo.