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

5 respostas
B

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:

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);
	}

}

JSP:

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

<html>
<body>
<form action="adicionaCidade">
Nome: <input type="text" name="nomeCidade" /><br />
    <select name="cbEstado">  
       <c:forEach var="estado" items="${dao.lista}">
		<td>${estado.nomeEstado}</td>
		<td>${estado.ufEst}</td>
		</c:forEach>
    </select>  
    
    <select name="cbEstado">    
      <c:forEach var="estado" items="${dao.lista}">    
        <option value="${estado.nomeEstado}">${estado.ufEst}</option>    
      </c:forEach>    
    </select>  
<input type="submit" value="Gravar" />
</form>
</body>
</html>

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

Grato!

5 Respostas

R

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.

B

No Servlet adicionei o seguinte trecho:

List<Estado> lista = dao.getLista();  
	      
	    request.setAttribute("listaEstados", lista);

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.

R

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 ?

B

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:

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

<html>
<body>
<!-- cria a lista -->
<jsp:useBean id="dao" class="dao.EstadoDAO"/>
<table>
<!-- for -->
<c:forEach var="estado" items="${dao.lista}">
<tr>
<td>${estado.nomeEstado}</td>
<td>${estado.ufEst}</td>
</tr>
</c:forEach>
</table>
</body>
</html>

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:

List<Estado> lista = dao.getLista();    
        
    request.setAttribute("listaEstados", lista);

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

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

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

Tentei das duas maneiras, mas nenhuma funcionou.

B

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:

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.

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

Criado 12 de março de 2012
Ultima resposta 12 de mar. de 2012
Respostas 5
Participantes 2