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

Dúvida para criar select no JSP

Eu não estou conseguindo criar um select para buscar os dados em uma tabela... Quero buscar a sigla do estado na tabela de estados... Na lista.jsp o c:forEach está funcionando perfeitamente na table...

Eu tenho o método no EstadoController:

    public void lista() {
        List<Estado> estados = estadoDao.lista();
        result.include("estados", estados);
    }

E no transportadora.jsp, que é onde eu quero buscar a informação, eu adicionei o código:

                    <select name="endEst">
                        <c:forEach items="${estados}" var="estado">
                        <option value="${estado.sigla}" ${transportadora.endEst eq estado.sigla ? "SELECTED" : ""}>${estado.sigla}</option>
                        </c:forEach>
                    </select>
                    <ebf:validationMessage name="transportadora.endEst" />

Aparece campo com uma "setinha" ao lado, mas as siglas cadastradas não...

Onde estou errando ? Preciso implementar mais alguma coisa, ou existe algum erro ?

40 respostas

Olhando o código, só não consigo entender de onde vem a variável transportadora. Se for possível, cola aqui o html gerado no navegador.. talvez role uma dica.

Ewerton nesse jsp você esta importando a taglib referente ao core C da jstl ?

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Abraços

Bom dia Alberto e Mahteus!

Eu estou importando... Segue abaixo meu .jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="ebf"%>

<!DOCTYPE html>
<html>

<head>

<title>Módulo de Transportadoras</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="<c:url value='/css/bootstrap.css'/>" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="<c:out value="${pageContext.request.contextPath}"/>/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="<c:out value="${pageContext.request.contextPath}"/>/css/bootstrap-editable.css" />
<link rel="stylesheet" type="text/css" href="<c:out value="${pageContext.request.contextPath}"/>/css/bootstrap-theme.min.css" />
<link type="text/css" href="<c:out value="${pageContext.request.contextPath}"/>/css/jquery-ui-1.10.0.custom.css" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="<c:out value="${pageContext.request.contextPath}"/>/css/bootstrap-table.css" />
</head>

<body>
    <form action="${linkTo[TransportadoraController].adiciona(null)}" method="post">
        <input type="hidden" name="hdtransportadora" id="hdtransportadora" value="<%=request.getRemoteUser()%>"> <input type="hidden"
            value="1" id="controle_cons" name="controle_cons" /><br />
        <div id="container-fluid">
            <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
                <div class="container-fluid">
                    <!-- Brand and toggle get grouped for better mobile display -->
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                            <span class="sr-only">Toggle navigation</span>
                             <span class="icon-bar"></span> 
                             <span class="icon-bar"></span>
                             <span class="icon-bar"></span>
                        </button>
                        <a class="navbar-brand" href="#">INÍCIO TRANSPORTADORAS</a>
                    </div>
                    <!-- Collect the nav links, forms, and other content for toggling -->
                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li><a href="${linkTo[LoginController].desloga()}">Deslogar</a></li>
                            <li><a href="${linkTo[IndexController].index()}" id="pgInicial">Pág. Inicial</a></li>
                            <li><a href="${linkTo[TransportadoraController].lista()}" id="listarTransportadoras">Listar</a></li>
                        </ul>
                    </div>
                    <!-- /.navbar-collapse -->
                </div>
                <!-- /.container-fluid -->
            </nav>
        </div>
        <br /> <br /> <br />

        <div class="panel panel-default painelCabecalho">
            <div class="panel-heading">
                <h3 class="panel-title">Informações da Transportadora</h3>
            </div>
            <div id="collapse1" class="panel-body panel-collapse collapse"></div>
            <br />

            <!--PRIMEIRA LINHA... -->
            <div class="row text-left">
                <div class="col-md-2">
                    <span>Nro.Cadastro:</span> <input type="text"
                        name="transportadora.numCadastro" size="7" maxlength="7" id="numCadastro" class="form-control" value="${transportadora.numCadastro}" autofocus="autofocus" /><br />
                    <ebf:validationMessage name="transportadora.numCadastro" />
                </div>
                <div class="col-md-2">
                    <span>Num.Cad.Antigo:</span>
                    <input type="text" name="transportadora.numCadAntigo" size="50" maxlength="50" id="numCadAntigo" class="form-control" value="${transportadora.numCadAntigo}" /><br />
                    <ebf:validationMessage name="transportadora.numCadAntigo" />
                </div>
<!--                RETIREI O INPUT DE DATA, POIS ESTOU PREENCHENDO A DATA SO SISTEMA, NO MOMENTO DO CADASTRO                 -->
<!--                 <div class="col-md-2"> -->
<!--                     <span>Dt. Cadastro:</span> -->
<%--                     <input type="date" name="transportadora.data_cadastro" size="10" maxlength="10" id="data_cadastro" class="form-control" value="${transportadora.data_cadastro}" /><br /> --%>
<%--                     <ebf:validationMessage name="transportadora.data_cadastro" /> --%>
<!--                 </div> -->
                <div class="col-md-2"></div>
            </div>
            <br />

            <!--SEGUNDA LINHA... -->
            <div class="row text-left">
                <div class="col-md-3">
                    <span>Razão Social:</span> 
                    <input type="text" name="transportadora.nome" size="40" maxlength="40" id="nome" class="form-control" value="${transportadora.nome}" /><br />
                    <ebf:validationMessage name="transportadora.nome" />
                </div>
                <div class="col-md-2">
                    <span>CNPJ:</span>
                    <input type="text" name="transportadora.cnpj" size="20" maxlength="20" id="cnpj" class="form-control" value="${transportadora.cnpj}" /><br />
                    <ebf:validationMessage name="transportadora.cnpj" />
                </div>
                <div class="col-md-2">
                    <span>Inscr.Estadual:</span>
                    <input type="text" name="transportadora.inscEst" size="20" maxlength="20" id="inscEst" class="form-control" value="${transportadora.inscEst}" /><br />
                    <ebf:validationMessage name="transportadora.inscEst" />
                </div>
                <div class="col-md-3"></div>
            </div>
            <br />

            <!--TERCEIRA LINHA... -->
            <div class="row text-left">
                <div class="col-md-3">
                    <span>Endereço:</span> 
                    <input type="text" name="transportadora.endRua" size="100" maxlength="100" id="endRua" class="form-control" value="${transportadora.endRua}" /><br />
                    <ebf:validationMessage name="transportadora.endRua" />
                </div>
                <div class="col-md-1">
                    <span>Número</span> 
                    <input type="text" name="transportadora.endNum" size="10" maxlength="10" id="endNum" class="form-control" value="${transportadora.endNum}" /><br />
                    <ebf:validationMessage name="transportadora.endNum" />
                </div>
                <div class="col-md-1">
                    <span>Complemento:</span> 
                    <input type="text" name="transportadora.endCompl" size="50" maxlength="50" id="endCompl" class="form-control" value="${transportadora.endCompl}" /><br />
                    <ebf:validationMessage name="transportadora.endCompl" />
                </div>
                <div class="col-md-2">
                    <span>Bairro:</span> 
                    <input type="text" name="transportadora.endBair" size="50" maxlength="50" id="endBair" class="form-control" value="${transportadora.endBair}" /><br />
                    <ebf:validationMessage name="representante.endBair" />
                </div>
                <div class="col-md-3"></div>
            </div>
            <br />

            <!--QUARTA LINHA... -->
            <div class="row text-left">
                <div class="col-md-3">
                    <span>Cidade:</span> 
                    <input type="text" name="transportadora.endCid" size="100" maxlength="100" id="endCid" class="form-control" value="${transportadora.endCid}" /><br />
                    <ebf:validationMessage name="transportadora.endCid" />
                </div>
                <div class="col-md-1">
                    <span>UF:</span> 
                    <select name="endEst">
<%--                 <input type="text" name="transportadora.endEst" size="2" maxlength="2" id="endEst" class="form-control" value="${transportadora.endEst}" /><br /> --%>
                        <c:forEach items="${estados}" var="estado">
                        <option value="${estado.sigla}" ${transportadora.endEst eq estado.sigla ? "SELECTED" : ""}>${estado.sigla}</option>
                        </c:forEach>
                    </select>
                    <ebf:validationMessage name="transportadora.endEst" />
                </div>

                <div class="col-md-1">
                    <span>CEP:</span>
                    <input type="text" name="transportadora.endCep" size="10" maxlength="10" id="endCep" class="form-control" value="${transportadora.endCep}" /><br />
                    <ebf:validationMessage name="transportadora.endCep" />
                </div>
                <div class="col-md-2">
                    <span>País:</span> 
                    <input type="text" name="transportadora.endPais" size="50" maxlength="50" id="endPais" class="form-control" value="${transportadora.endPais}" /><br />
                    <ebf:validationMessage name="transportadora.endPais" />
                </div>
                <div class="col-md-3"></div>
            </div>
            <br />

            <!--QUINTA LINHA... -->
            <div class="row text-left">
                <div class="col-md-1">
                    <span>DDD:</span> 
                    <input type="text" name="transportadora.endDDD" size="5" maxlength="5" id="endDDD" class="form-control" value="${transportadora.endDDD}" /><br />
                    <ebf:validationMessage name="transportadora.endDDD" />
                </div>
                <div class="col-md-2">
                    <span>Telefone:</span> 
                    <input type="text" name="transportadora.endTel" size="50" maxlength="50" id="endTel" class="form-control" value="${transportadora.endTel}" /><br />
                    <ebf:validationMessage name="transportadora.endTel" />
                </div>
                <div class="col-md-2">
                    <span>Fax:</span> 
                    <input type="text" name="transportadora.endFax" size="50" maxlength="50" id="endFax" class="form-control" value="${transportadora.endFax}" /><br />
                    <ebf:validationMessage name="transportadora.endFax" />
                </div>

                <div class="col-md-2">
                    <span>Email:</span> 
                    <input type="email" name="transportadora.endEmail" size="100" maxlength="100" id="endEmail" class="form-control" value="${transportadora.endEmail}" /><br />
                    <ebf:validationMessage name="transportadora.endEmail" />
                </div>
                <div class="col-md-1"></div>
            </div>
            <br />

            <!--SÉTIMA LINHA... -->
            <div class="row text-left">
                <div class="col-md-7">
                    <span>Observação:</span>
                    <textarea name="transportadora.observ" rows="2" cols="200" maxlength="200" id="observ" class="form-control"></textarea>
                    <ebf:validationMessage name="transportadora.observ" />
                </div>
                <div class="col-md-7"></div>
            </div>
            <br />

            <!--OITAVA LINHA... -->
            <div class="row text-left">
                <div class="col-md-2">
                    <span>Data alteração:</span> 
                    <input type="date" name="transportadora.data_alteracao" size="10" maxlength="10" id="data_alteracao" class="form-control" value="${transportadora.data_alteracao}" /><br />
                    <ebf:validationMessage name="transportadora.data_alteracao" />
                </div>
                <div class="col-md-2">
                    <span>Usuário alteração:</span> 
                    <input type="text" name="transportadora.userAlteracao" size="4" maxlength="4" id="userAlteracao" class="form-control" value="${transportadora.userAlteracao}" /><br />
                    <ebf:validationMessage name="transportadora.userAlteracao" />
                </div>
                <div class="col-md-1">
                    <span>Ativo:</span>
                    <select name="transportadora.ativo" id="ativo" class="form-control">
                        <option value="S">Sim</option>
                        <option value="N">Não</option>
                    </select><br />
                    <ebf:validationMessage name="transportadora.ativo" />
                    <div class="col-md-2"></div>
                </div>
            </div>
            <br />
            <input type="submit" value="Cadastrar" class="btn btn-primary"> <br /> <br />

            <div id="dialog" title="Lista de Transportadoras" style="overflow-x: hidden;">
                <table id="tabPesquisa"></table>
            </div>
        </div>
    </form>
</body>
</html>

Está na:

<!--QUARTA LINHA... -->
<span>UF:</span>

Ewerton, seu problema esta nos values do select ou no texto deles ?

Para testarmos se a lista de estados esta sendo injetada no html faça um teste, imprima os estados diretamente no seu JSP:

<c:forEach items="${estados}" var="estado">
    ${estado.sigla}                       
</c:forEach>

Obs: Apenas uma observação, sempre deixe o campo CEP na frente de todos os campos referente ao endereço, pois futuramente você pode implementar uma busca de CEP evitando que o usuário realize o preenchimento dos demais campos.

Não mostrou nada Matheus...

Posso te mandar um print da tela por e-mail ?

Alguma ideá pessoal ??

Bom, acho que devemos ficar no básico... Quando vc acessa o endereço pelo navegador, ta passando pelo método do seu controller? Caso esteja passando, qual valor está na variável estados na JSP? Qual código fonte foi gerado no navegador(exibir código fonte no navegador mesmo)?

Então Alberto, passa pelo controller sim...

Porque no outro .jsp (lista.jsp), a tabela é preenchida normalmente, com os dados da tabela de estados...

Opa, vc testou? O problema eh que não ta funcionando... Então alguma coisa não tá rolando. Vc tem que debugar cada ponto e tal.

Ewerton vamos fazer um log no console do eclipse, altera seu método lista para:

public void lista() {
    List<Estado> estados = estadoDao.lista();
    for (Estado e : estados) {
        System.out.println(e.getSigla());
    }
    result.include("estados", estados);
}

Após acessar a página veja no seu console do eclipse se foram impressos as siglas dos estados.

Bom dia Matheus!

Alterei o método lista no Controller, mas não fez "nada"...

Nem montou a listagem no select, nem gerou qq informação no console...

Isso quer dizer que o endereço que vc está acessando não está passando pelo controller.. Você precisa nos passar exatamente o que vc ta fazendo.. Qual endereço está acessando? Se colocar um syso no inicio do método, aparece? Se não está batendo no controller, não vai funcionar mesmo... Não tem mágica, tem que sair testando até achar o erro.

Por exemplo, agoar que eu vi..na primeira mensagem vc diz que ta acessando vendo a página transaportadora.jsp, mas o método lista não joga para ela.. logo, vc não está passando pelo método. A url que vc está acessando está batendo em outro endereço...

Exato, assim como o Alberto disse, adicione um System.out na primeira linha do método:

public void lista() {
    System.out.println("---------- Estou no método para listar estados ------");
    // ...
}

Não tinha reparado também, mas agora que o Alberto mencionou você esta no jsp do método da transportadora e esta tentando pegar o retorno de um outro método, por mais que ambos estejam no mesmo controller você não irá conseguir chamar o método estados dessa maneira.

Para fazer preencher o select com os estados terá que fazer com ajax, tenho uma biblioteca de js que contém o que você esta precisando fazer: https://github.com/mahenrique94/library-js/blob/master/select.js

Basicamente precisa apenas de um select assim:

<select data-select="slCadEstado" data-url="slCadastro_Estado_Json_01">

Onde:

data-select: Um nome para escolher quais campos iremos utilizar no preenchimento do select.

data-url: Caminho para chegar no seu método.

Da transportadora.jsp, eu não consigo chamar o método lista do EstadoController ??

Eu não queria utilizar JavaScript....

Não, vc não consegue. O que vc precisa fazer é alterar o método do seu controller que te leva para a jsp de transportadora e a partir de lá carregar a lista de estados e disponibilizar no result. Fazendo isso vc resolve seu problema sem usar javascript ou qualquer outra solução.

Oi Everton

Vi que você tem esse método, no EstadoController:

public void lista() {
        List<Estado> estados = estadoDao.lista();
        result.include("estados", estados);
}

mas essa lista de estados só ficará disponível na JSP estado/lista, não nas demais. O include é apenas para a JSP que passa por esse método do controller. Faz sentido?

Se você quer que a transportadora.jsp tenha essa lista de estado disponível, precisa fazer esse include no método do controller que renderiza essa página.

Não entendi muito bem pessoal...

Eu implementei um o método listaEstados(), na TransportadoraDao. Porque eu já tenho um método lista(), nessa TransportadoraDao:

    public List<Estado> listaEstados() {
        TypedQuery<Estado> query = manager.createQuery("Select e from Estado e ", Estado.class);
        return query.getResultList();
    }

E na TransportadoraController eu chamei da seguinte forma:

    public void listaEstados() {
        List<Estado> estados = estadoDao.lista();
        result.include("estados", estados);
    }

Mas não funcionou... Desculpe-me, mas não estou entendendo o funcionamento da estrutura...

oi Ewerton,

acho que falta dar uma reforçada de conhecimento do funcionamento base do framework, de como funciona a criação de rotas, views e como passar parâmetros.

Se você não tiver tempo de revisar o nosso inicial de VRaptor 4, não deixe de dar uma lida nos guias de 1 e 10 minutos da documentação, que sem dúvida vão dar uma clareada.

http://www.vraptor.org/pt/docs/guia-de-1-minuto/

Pra te ajudar a sair desse problema, preciso de uma informação fundamental:

qual o método da TransportadoraController que devolve essa transportadora.jsp? Pode mostrar como ele está implementado? Esconda informações privilegiadas, se for necessário.

Bom dia pessoal!

Eu dei uma olhada no material do curso que eu fiz do VRaptor4, no capitulo 5, fala um pouco sobre a anotação @Get... Li também o Guia de 1 e 10 min, acessei os links do material... Mas consegui chegar a uma solução...

Eu implementei um novo método, no EstadoDao:

    public List<Estado> listaSigla() {
        TypedQuery<Estado> query = manager.createQuery("Select e from Estado e Order By sigla", Estado.class);
        return query.getResultList();
    }

E adicionei a chamada dele no EstadoController com a anotação:

    @Get("/estado")
    public void listaSigla() {
        List<Estado> estadosSigla = estadoDao.lista();
        result.include("estadosSigla", estadosSigla);
    }

Eu não tenho que adicionar , result.of(this).index(); no controller, porque eu vou chamar esta listagem em outras .jsp´s correto...

O método na TransportadoraController que devolve a transportadora,jsp é o método index():

    public void index() {
    }

Nesse .jsp eu tenho os inputs para cadastrar uma nova trasportadora e após o cadastro direciono para a lista.jsp, com os cadastros das transportadoras existentes na tabela...

Ewerton, apenas fazendo algumas observações, acredito que nomear seus controllers e métodos sejam de extrema importância, o certo o método para cadastrar uma nova transforma deveria ser "formulario".

O método index geralmente nos devolve a página principal de nossa aplicação.

E novamente ressalto que a melhor forma de popular os selects com Estados e Cidades deva ser com requisições ajax e não utilizando o include do Result.

Abraçooos.

Boa tarde Matheus! Eu fiz o log que vc me orientou anteriormente, e não sei pq hj funcionou... Peencheu a lista das siglas no console...

Mas em fim... A minha intenção nesse sistema é criar o mínimo de arquivos possíveis...

Quando vc diz peencher o select com ajax, vc diz criar arquivos javaScript para isso ?

Por gentileza, me passe algum link de exemplo para que eu possa montar esses select´s...

Meu tempo está se esgotando :( Amanhã cedo, tenho que apresentar o sistema... OBS.: Eu renomeei TODOS os arquivos que estavam como index.jsp para formulario.jsp, e alteirei a chamada nos controllers...

Exato, seria criar um javascript para realizar a busca dos Estados no servidor e populá-los, mas ja que seu tempo é curso talvez podemos fazer da seguinte maneira:

EstadoController:

protected List<Estado> listaEstados() {
    return estadoDao.lista();
}

TransportadoraController:

@Inject
private EstadoController estadoController;
@Inject
private Result result;

public void formulario() {
    this.result.include("estadosSigla", this.estadoController.listaEstados());
}

Veja que criei um método no controller dos estados para devolver uma lista de acordo com o seu banco de dados, feito isso apenas fiz a busca e include da lista assim que acessar o formulario da transportadora.

Agora basta fazer seu c:forEach que deverá dar certo.

Não deu certo Matheus...

Já estou utilizando result na TransportadoraController, tentei renomear para result2, mas não foi...

package br.com.ebf.controller;

import java.util.List;

import javax.inject.Inject;
import javax.validation.Valid;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.interceptor.IncludeParameters;
import br.com.caelum.vraptor.validator.Validator;
import br.com.ebf.dao.TransportadoraDao;
import br.com.ebf.modelo.Transportadora;

@Controller
public class TransportadoraController {

    private TransportadoraDao transportadoraDao;
    private Result result;
    private Validator validator;

    @Inject
    public TransportadoraController(TransportadoraDao transportadoraDao, Result result, Validator validator) {
        this.transportadoraDao = transportadoraDao;
        this.result = result;
        this.validator = validator;
    }

    // PARA USO DO CDI
    public TransportadoraController() {
    }

    public void formulario() {
    }

    @IncludeParameters
    public void salva(@Valid Transportadora transportadora) {
        validator.onErrorRedirectTo(this).formulario();
        transportadoraDao.salva(transportadora);
        result.redirectTo(this).lista();
    }

    public void atualiza(int numCadastro, Result result) {
        Transportadora transportadora = transportadoraDao.buscaPorNumCadastro(numCadastro);
        result.include(transportadora);
        result.of(this).formulario();
    }

    public void lista() {
        List<Transportadora> transportadoras = transportadoraDao.lista();
        result.include("transportadoras", transportadoras);
    }
}

O método lista() do EstadoDao, que é chamado pelo EstadoController está funcionando, pq eu consigo popular a lista.jsp...

Porém ela está no mesmo "pacote" pela convenção... (WEB-INF\jsp\estado)...

Mas essa lista() de "ESTADOS" que está no EstadoDAO eu vou utilizar em vários outros formularios .jsp Da mesma forma que a lista de "CIDADES", "RESPRESENTANTES"...

Obrigado pela ajuda pessoal!! Mas na prática os problemas são bem mais complexos do que no curso... Pelo menos eu revisei o material do curso de VRaptor 4, e não encontrei nada sobre redirecionamento de métodos entre os Controller´s...

O que é "nao foi" Ewerton? Deu erro? Qual exception? Nao saiu nada? Se nao saiu nada, o que acontece se colocar um log dentro do metodo formulario, aparece? E por que o seu formulario esta vazio, diferente do que Matheus falou?

Tente sempre mandar o maximo de dados possivel pra gente.

Incluindo a linha:

    public void formulario() {
        this.result.include("estadosSigla", this.estadoController.listaEstados());   
    }

estadoController cannot be resolved or is not a field

Ele gera erro na linha e me dá duas opções:

Create field 'estadoController' in type 'TransportadoraController' Create constant 'estadoController' in type 'TransportadoraController'

Na primeira opção ele cria a variável => private Object estadoController; e no método fica o erro "The method listaEstados() is undefined for the type object"

Na segunda opção ele cria a variável => private static final String estadoController = null; e no método fica o erro "The method listaEstados() is undefined for the type String

Oi Ewerton

O erro diz tudo: de onde vem esse estadoController que você está usando para pegar a lista? Mesmo que você esteja recebendo um controller como injeção de dependência do outro, o cenário não seria ideal.

Me parece que você só quer fazer isso:

@Controller
public class TransportadoraController {

    private TransportadoraDao transportadoraDao;
    private Result result;
    private Validator validator;
    private EstadoDAO estadoDao;

    @Inject
    public TransportadoraController(TransportadoraDao transportadoraDao, Result result, Validator validator, EstadoDAO estadoDao) {
        this.transportadoraDao = transportadoraDao;
        this.result = result;
        this.validator = validator;
        this.estadoDao = estadoDao;
    }

    // construtor vazio e outros métodos

    public void lista() {
        List<Transportadora> transportadoras = transportadoraDao.lista();
        result.include("transportadoras", transportadoras);
        result.include("estados",  estadoDao.lista());
    }
}

perceba que estou pedindo o DAO no construtor do controller, e fazendo o include da lista de estados no método lista().

Faz sentido?

Blz Rodrigo acho que entendi o que vc me explicou...

Mas no meu caso a lista de estados não será mostrada jundo da lista de transportadoras e sim, no formulario.jsp onde eu vou cadastrar uma transportadora... O usuário irá selecionar um um listbox o estado, outro listbox para cidade, etc...

Eu fiz conforme vc me explicou, na TransportadoraController:

@Controller
public class TransportadoraController {

    private TransportadoraDao transportadoraDao;
    private Result result;
    private Validator validator;
    private EstadoDao estadoDao;

    @Inject
    public TransportadoraController(TransportadoraDao transportadoraDao, Result result, Validator validator,
            EstadoDao estadoDao) {
        this.transportadoraDao = transportadoraDao;
        this.result = result;
        this.validator = validator;
        this.estadoDao = estadoDao;
    }

//Contrutor e outros métodos...

    public void listaSiglas() {
        List<Estado> siglaEstados = estadoDao.listaSigla();
        result.include("siglaEstados", siglaEstados);
    }

No EstadoDao:

    public List<Estado> listaSigla() {
        TypedQuery<Estado> query = manager.createQuery("Select e from Estado e Order By sigla", Estado.class);
        return query.getResultList();
    }

E no formulario.jsp, onde eu cadastro a transportadora:

                <div class="col-md-2">
                    <span>UF:</span>
                    <select name="transportadora.endEst" id="endEst" class="form-control">
                    <option>
                        <c:forEach items="${siglaEstados}" var="siglaEstado">
                            <option value="${siglaEstados.sigla}">${siglaEstados.sigla}</option>
                        </c:forEach>
                    </option>
                    </select>
                    <ebf:validationMessage name="transportadora.endEst" />
                </div>

Mas não listou as Siglas no combo...

solução!

quem está chamando esse método do controller?

 public void listaSiglas() {
        List<Estado> siglaEstados = estadoDao.listaSigla();
        result.include("siglaEstados", siglaEstados);
    }

se você precisa que o include aconteça dentro do formulário.jsp, você precisa chamar esse método (ou mover esse código) dentro do método formulario() do seu controller.

Vou movê-lo...

Eu chamei o listaSigla no método formulario():

    public void formulario() {
        this.listaSiglas();
    }

Blz, listou os estados no combo...

Mas qdo eu salvei o registro, eu direciono pra lista de transportadoras, e por algum motivo ela foi danificada...

Não está mais mostrando as informações...

Verifiquei q salvou o registro, mas o campo estado ficou "NULL" pq eu dei um select na tabela...

ótimo! o problema de não estar salvando corretamente só me parece ser esse aqui:

<c:forEach items="${siglaEstados}" var="siglaEstado">
    <option value="${siglaEstados.sigla}">${siglaEstados.sigla}</option>
</c:forEach>

repare que você criou var="siglaEstado", mas no value do campo usou ${siglaEstados.sigla} (plural).

experimente mudar para $siglaEstado.sigla} e ver no HTML se o valor é preenchido corretamente.

Alterei, mas não resolveu Rodrigo...

                    <select name="transportadora.endEst" id="endEst" class="form-control">
                    <option>
                        <c:forEach items="${siglaEstados}" var="siglaEstado">
                            <option value="${siglaEstado.sigla}">${siglaEstado.sigla}</option>
                        </c:forEach>
                    </option>
                    </select>

E o que saiu no resultado desse select? Isso é, como está com html? Lembre-se sempre de dar o maximo de informacoes assim a gente pode te ajudar mais rapidamente

O select com as sigas dos estados ele montou... Mas qdo eu salvo ele, não mostra o registro na listagem... Dei um select e o campo end_est que deveria ser preenchido com o valor do combo está "null"... Quando eu tento editar o registro pelo método atualiza, o combo vem vazio, e não monta mais a lista de siglas...

Entendo Ewerton, mas realmente preciso que voce mostre o que eu pedi: o html gerado nesse select, como ficou?

E o problema de salvar ja nao tem mais relacao com o select, é no form para onde voce submete a edicao. Ai voce pode abrir uma nova duvida focando no codigo do metodo que faz esse update/merge

O código fonte/html da página formulario() da transportadora:





<!DOCTYPE html>
<html>

<head>

<title>Módulo de Transportadoras</title>

<!-- <meta charset="UTF-8"> -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="/ebfvaz-cadastro/css/bootstrap.css" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="/ebfvaz-cadastro/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="/ebfvaz-cadastro/css/bootstrap-editable.css" />
<link rel="stylesheet" type="text/css" href="/ebfvaz-cadastro/css/bootstrap-theme.min.css" />
<link type="text/css" href="/ebfvaz-cadastro/css/jquery-ui-1.10.0.custom.css" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="/ebfvaz-cadastro/css/bootstrap-table.css" />

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
<script src="jquery.maskedinput.js" type="text/javascript"></script>

</head>

<body>
    <form action="/ebfvaz-cadastro/transportadora/salva"
        method="post">
        <input type="hidden" name="hdtransportadora" id="hdtransportadora" value="null"> <input type="hidden" value="1" id="controle_cons" name="controle_cons" /><br />
        <div id="container-fluid">
            <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
                <div class="container-fluid">
                    <!-- Brand and toggle get grouped for better mobile display -->
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                            <span class="sr-only">Toggle navigation</span> 
                            <span class="icon-bar"></span> <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                        </button>
                        <a class="navbar-brand" href="#">INÍCIO TRANSPORTADORAS</a>
                    </div>
                    <!-- Collect the nav links, forms, and other content for toggling -->
                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li><a href="">Deslogar</a></li>
                            <li><a href="/ebfvaz-cadastro/" id="pgInicial">Pág. Inicial</a></li>
                            <li><a href="/ebfvaz-cadastro/transportadora/lista" id="listarTransportadoras">Listar</a></li>
                        </ul>
                    </div>
                    <!-- /.navbar-collapse -->
                </div>
                <!-- /.container-fluid -->
            </nav>
        </div>
        <br /> <br /> <br />

        <div class="panel panel-default painelCabecalho">
            <div class="panel-heading">
                <h3 class="panel-title">Informações da Transportadora</h3>
            </div>
            <div id="collapse1" class="panel-body panel-collapse collapse"></div>
            <br />

            <!--PRIMEIRA LINHA... -->
            <div class="row text-left">
                <!--                 <div class="col-md-2"> -->
                <!--                 <span>Nro.Cadastro:</span> -->
                <input type="hidden" name="transportadora.numCadastro" size="7"
                    maxlength="7" id="numCadastro" class="form-control" value="" autofocus="autofocus" /><br />

<span class="validation-error">

</span>
                <!--                 </div> -->

                <div class="col-md-2">
                    <span>Num.Cad.Antigo:</span>
                    <input type="text" name="transportadora.numCadAntigo" size="50" maxlength="50" id="numCadAntigo" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>

                <!--                RETIREI O INPUT DE DATA, POIS ESTOU PREENCHENDO A DATA SO SISTEMA, NO MOMENTO DO CADASTRO                 -->
                <!--                 <div class="col-md-2"> -->
                <!--                     <span>Dt. Cadastro:</span> -->


                <!--                 </div> -->

                <div class="col-md-2"></div>
            </div>
            <br />

            <!--SEGUNDA LINHA... -->
            <div class="row text-left">
                <!--                 <div class="col-md-2"> -->
                <!--                <span>Nro.Cadastro:</span>  -->
                <input type="hidden" name="transportadora.numCadastro" size="7" maxlength="7" id="numCadastro" class="form-control"
                    value="" /><br />

<span class="validation-error">

</span>
                <!--                 </div> -->

                <div class="col-md-3">
                    <span>Razão Social:</span>
                    <input type="text" name="transportadora.nome" size="40" maxlength="40" id="nome" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-2">
                    <span>CNPJ:</span> <input type="text" name="transportadora.cnpj" size="20" maxlength="20" id="cnpj" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-2">
                    <span>Inscr.Estadual:</span>
                    <input type="text" name="transportadora.inscEst" size="20" maxlength="20" id="inscEst" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-3"></div>
            </div>
            <br />

            <!--TERCEIRA LINHA... -->
            <div class="row text-left">
                <div class="col-md-3">
                    <span>Endereço:</span>
                    <input type="text" name="transportadora.endRua" size="100" maxlength="100" id="endRua" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-1">
                    <span>Número</span>
                    <input type="text" name="transportadora.endNum" size="10" maxlength="10" id="endNum" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-1">
                    <span>Complemento:</span>
                    <input type="text" name="transportadora.endCompl" size="50" maxlength="50" id="endCompl" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-2">
                    <span>Bairro:</span>
                    <input type="text" name="transportadora.endBair" size="50" maxlength="50" id="endBair" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-3"></div>
            </div>
            <br />

            <!--QUARTA LINHA... -->
            <div class="row text-left">
                <div class="col-md-3">
                    <span>Cidade:</span>
                    <input type="text" name="transportadora.endCid" size="100" maxlength="100" id="endCid" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>

                <div class="col-md-2">
                    <span>UF:</span>
                    <select name="transportadora.endEst" id="endEst" class="form-control">
                    <option>

                            <option value="PE">PE</option>

                            <option value="PR">PR</option>

                            <option value="SE">SE</option>

                    </option>
                    </select>

<span class="validation-error">

</span>
                </div>

                <div class="col-md-1">
                    <span>CEP:</span> 
                    <input type="text" name="transportadora.endCep" size="10" maxlength="10" id="endCep" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-2">
                    <span>País:</span> 
                    <input type="text" name="transportadora.endPais" size="50" maxlength="50" id="endPais" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-3"></div>
            </div>
            <br />

            <!--QUINTA LINHA... -->
            <div class="row text-left">
                <div class="col-md-1">
                    <span>DDD:</span> 
                    <input type="text" name="transportadora.endDDD" size="5" maxlength="5" id="endDDD" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-2">
                    <span>Telefone:</span>
                    <input type="text" name="transportadora.endTel" size="50" maxlength="50" id="endTel" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-2">
                    <span>Fax:</span> 
                    <input type="text" name="transportadora.endFax" size="50" maxlength="50" id="endFax" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>

                <div class="col-md-2">
                    <span>Email:</span> 
                    <input type="email" name="transportadora.endEmail" size="100" maxlength="100" id="endEmail" class="form-control" value="" /><br />

<span class="validation-error">

</span>
                </div>
                <div class="col-md-1"></div>
            </div>
            <br />

            <!--SÉTIMA LINHA... -->
            <div class="row text-left">
                <div class="col-md-7">
                    <span>Observação:</span>
                    <textarea name="transportadora.observ" id="observ" rows="2" cols="200" maxlength="200" class="form-control"></textarea>
                    <!--                     required="required" -->

<span class="validation-error">

</span>
                </div>
                <div class="col-md-7"></div>
            </div>
            <br />

            <!--OITAVA LINHA... -->
            <div class="row text-left">
                <!--                 <div class="col-md-2"> -->
                <!--                     <span>Data alteração:</span>  -->


                <!--                 </div> -->
                <!--                 <div class="col-md-2"> -->
                <!--                     <span>Usuário alteração:</span>  -->


                <!--                 </div> -->
                <div class="col-md-1">
                    <span>Ativo:</span>
                    <select name="transportadora.ativo" id="ativo" class="form-control">
                        <option value="S">Sim</option>
                        <option value="N">Não</option>
                    </select><br />

<span class="validation-error">

</span>
                    <div class="col-md-1"></div>
                </div>
            </div>
            <br /> <input type="submit" value="Cadastrar/Salvar"
                class="btn btn-primary"> <br /> <br />

            <div id="dialog" title="Lista de Transportadoras"
                style="overflow-x: hidden;">
                <table id="tabPesquisa"></table>
            </div>
        </div>
    </form>
</body>
</html>

Está tudo correto. O erro está em /ebfvaz-cadastro/transportadora/salva

Como esse erro ja nao tem relacao com o select e essa duvida foi clarificada, abra em um novo topico por favor. Se nao as pessoas veem que ja foi resolvida e nao virao ler o topico para continuar a ajudar. Lembre-se de colocar o codigo de edicao, o resultado do log ao tentar imprimir o que vem como endest e o maximo de dados possiveis (claro, tentando ser sucinto)

Abri um novo post, conforme vc me pediu Paulo...

=> https://cursos.alura.com.br/forum/topico-problema-ao-salvar-um-campo-select-28906

Obrigado a TODOS 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