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