[Resolvido] ComboBox JSP e a JSTL não trás nada

Boa Tarde.

Sigo minha rotina de Estudos da apostila FJ21 da Caelum, e estou fazendo um simples cadastro de Cidade e Estado. (Sei que essas informações eu posso tirar de um banco de dados de CEP, porém a intenção aqui é aprender ComboBox).

O Cadastro de Estado está OK, mas no cadastro de Cidade, preciso de um CB, que irá trazer a UF do estado, e gravar no Banco de Dados o código do mesmo.

Tentei da seguinte maneira, mas não deu certo:

EstadoDAO:

public List<Estado> getLista(){ try{ /* * Instancia a lista */ List<Estado> estados = new ArrayList<Estado>(); PreparedStatement stmt = conectar.prepareStatement("" + "select * from estado"); ResultSet rs = stmt.executeQuery(); while(rs.next()){ Estado novoEstado = new Estado(); novoEstado.setNomeEstado(rs.getString("nomeEstado")); novoEstado.setUfEst(rs.getString("uf")); estados.add(novoEstado); } stmt.close(); rs.close(); return estados; }catch (SQLException e) { throw new RuntimeException(e); } }

AdicionaEstadoServlet:

[code]public class AdicionaCidadeServlet extends HttpServlet{

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	
//PrintWriter saida = response.getWriter();

String nomeCidade = request.getParameter("nomeCidade");
String estado = request.getParameter("estado");

Cidade novaCidade = new Cidade();

novaCidade.setNomeCidade(nomeCidade);
novaCidade.setEstado(Long.parseLong(estado));

CidadeDAO dao = new CidadeDAO();

dao.adiciona(novaCidade);

RequestDispatcher rd = request.getRequestDispatcher("/cidade-adicionado.jsp");
rd.forward(request, response);

	//super.service(arg0, arg1);
}

}[/code]

JSP:

[code]<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

Nome:
${estado.nomeEstado} ${estado.ufEst}
<select name="cbEstado">    
  <c:forEach var="estado" items="${dao.lista}">    
    <option value="${estado.nomeEstado}">${estado.ufEst}</option>    
  </c:forEach>    
</select>  
[/code]

Usei duas maneiras no JSP, mas ambas trazem um ComboBOX vazio, alguém pode me ajudar? mostrar onde errei?

Grato!

Você não deve acessar o seu DAO diretamente da JSP. Ao invés disso, armazena a lista de estados que o DAO te retorna em um atributo de requisição ou sessão:

List<Estado> lista = dao.getLista();

request.setAttribute("listaEstados", lista);

ou então

List<Estado> lista = dao.getLista();

request.getHttpSession().setAttribute("listaEstados", lista);

e na JSP você utiliza a lista simplesmente com ${listaEstados}, ao invés de ${dao.lista}. É interessante fazer dessa forma senão o banco é consultado para cada referência da lista na JSP. Da maneira como eu expliquei, a consulta é feita uma única vez.

No Servlet adicionei o seguinte trecho:

[code] List lista = dao.getLista();

    request.setAttribute("listaEstados", lista);  [/code]

JSP:

<select name="cbEstado"> <c:forEach var="estado" items="${listaEstados}"> <option value="${estado.nomeEstado}">${estado.ufEst}</option> </c:forEach> </select>

Continua trazendo o ComboBox vázio.

Hmmm… e a pergunta que não quer calar, como está o fluxo de navegação do sistema ? quem chama o quê nessa história ?

Bom no EstadoDAO, eu tenho o método getLista que trás a lista de estados cadastra no banco.

tenho uma JSP chamada lista-estado com o seguinte conteúdo:

[code]<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

${estado.nomeEstado} ${estado.ufEst}
[/code]

Se eu acesso http://localhost:8080/LocadoraWEB-JSP-JSTL-TABLIB/adiciona-cidade.jsp
funciona perfeitamente me trazendo a lista de Estado.

Agora estou querendo que no comboBox no cadastro de Cidade, traga o UF e salve no banco o código.

Tentei da maneira citada no post anterior, mas não adianto.

O Servlet está responsável por pegar o request digitado pelo usuário no formulário, e em seguida grava chama o método adiciona do EstadoDao e grava no banco.

Adicionei:

[code]List lista = dao.getLista();

request.setAttribute("listaEstados", lista);   [/code]

no Servlet para pega a Lista que está EstadoDAO, e em seguida usei o atributo no JSP para preencher o comboBox

[code]
<c:forEach var=“estado” items="${listaEstados}">

${estado.nomeEstado}
${estado.ufEst}
</c:forEach>
</select>  

<select name="cbEstado">    
  <c:forEach var="estado" items="${listaEstados}">    
    <option value="${estado.nomeEstado}">${estado.nomeEstado}</option>    
  </c:forEach>    
</select>  [/code]

Tentei das duas maneiras, mas nenhuma funcionou.

Deixando assim funciona:

UF: <select name="cbEstado"> <c:forEach var="estado" items="${dao.lista}"> <option value="${estado.ufEst}">${estado.ufEst}</option> </c:forEach> </select>

Mas acontece o seguinte erro no momento da gravação:

[code]exception

java.lang.NumberFormatException: null
java.lang.Long.parseLong(Long.java:401)
java.lang.Long.parseLong(Long.java:478)
servlet.AdicionaCidadeServlet.service(AdicionaCidadeServlet.java:30)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.35 logs.[/code]

Como eu tinha dito, o usuário vai escolher no combo “SP”, por exemplo, mas irá gravar o código do tipo Long, por exemplo, 100