Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Combobox - como trazer o registro do banco de dados?

Olá pessoal, boa noite!

Estou tentando utilizar o combobox no cadastro de usuario, para gravar a cidade. Já estou conseguindo fazer a listagem e gravar a cidade selecionada no cadastro do usuário.

O problema é na hora de EDITAR... na tela de listagem, clico em um usuário pra editar e traz sempre a primeira cidade da lista e deveria trazer a cidade cadastrada (a cidade que está gravada no registro desse usuário que vem do banco de dados).

Estava tentando com o if ternário e algumas outras opções, mas ta sempre faltando alguma coisa e não vem. E não consigo acompanhar pelo modo de debug quando esse combobox é preechido.

Segue o código:

public class UsuarioController {

    private UsuarioDao UsuarioDao;
    private Result result;
    private Validator validator;

    private cidadeDao cidadeDao;

    public UsuarioController(){}

    @Inject
    public UsuarioController(UsuarioDao UsuarioDao, Result result, Validator validator, cidadeDao cidadeDao){
        this.UsuarioDao = UsuarioDao;
        this.result = result;
        this.validator = validator;
        this.cidadeDao = cidadeDao;
    }

    public void form(){
        result.include("cidades", cidadeDao.lista());
    }

    @IncludeParameters
    public void adiciona(@Valid Usuario usuario){
        validator.onErrorRedirectTo(this).form();
        UsuarioDao.adiciona(usuario);
        result.redirectTo(this).lista();
    }

    public void lista(){
        List<Usuario> usuarios = UsuarioDao.lista();
        result.include("usuarios", usuarios);
    }

    public void editar(int id, Result result){
        Usuario usuarioEncontrada = UsuarioDao.pegaPorId(id);
        result.include(usuarioEncontrada);
        result.include("cidades", cidadeDao.lista());
        result.of(this).form();
    }

Form.jsp (do cadastro do usuário)

<form action="${linkTo[UsuarioController].adiciona(null)}" method="post">
    <input type="hidden" name="usuario.id" value="${usuario.id}"/>
    <div class="form-group">      
        <label for="titulo">Nome do Usuário</label>
        <input type="text" name="usuario.nome" id="nome" class="form-control" value="${usuario.nome}"/>
        <tag:validationMessage name="usuario.titulo"/>


        <div class="form-group">
            <label for="cidades">Selecione uma cidade:</label>
            <select id="cidades" name="usuario.cidade.id" class="form-control">
                <c:forEach var="c" items="${cidades}">
                    <option value="${c.id}"> ${c.nome}</option>  
                </c:forEach>  
            </select>
        </div>
        <tag:validationMessage name="usuario.cidade"/>
    </div>
</form>

abraços.

2 respostas
solução!

Marciel, vou começar te apontando um potencial problema: você precisa alterar a rota do formulário quando estiver editando pra não criar um usuário duplicado.

Fora isso, vamos ver o que eu encontrei aqui. 1. Não tenho certeza de que seja parte do problema, mas pode ser que sim: você dá um result.include(usuarioEncontrada) sem passar o nome da variável que vai ser gerada na jsp. Já que usa usuario na jsp, seria bom tom fazer result.include("usuario", usuarioEncontrada) 2. Seu código da JSP está certinho e ele gera o combobox direitinho, só falta selecionar o item certo. Você pode fazer isso com um if ternário, mas vou utilizar o c:if pois fica um pouco mais claro:

<select id="cidades" name="usuario.cidade.id" class="form-control">
  <c:forEach var="c" items="${cidades}">
    <option
            value="${c.id}"
            <c:if test="${usuario.cidade.id == c.id}">selected</c:if>
    >
      ${c.nome}
    </option>
  </c:forEach>  
</select>

Caso a cidade do seu usuário seja igual à cidade atual do seu laço forEach, marque como selected.

É isso, deve resolver seu problema!

Olá Marco Salles,

Deu certo, funcionou!

Muito obrigado pela ajuda. Estou arrumando a rota e mais umas coisas aqui. valeu pelas dicas.

Desculpa a demora pra responder. Grande abraço e valeuzão pela ajuda.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software