Exercícios: Lógica para alterar contatos(Lista Vazia)

Apostila Caelum FJ21 - 9.9 - Exercícios: Lógica para alterar contatos(Lista Vazia)

Estou iniciando em java e estou seguindo a apostila da Caelum e estou com problemas no exercício 9.9 Lógica para Listar contatos - A lista na página “lista-contatos” está vazia. Alquem pode me ajudar?

Segue o código…

Classe Controladora

/**
 * Servlet implementation class ControllerServlets
 */
@WebServlet("/mvc")
public class ControllerServlets extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		String parametro = req.getParameter("logica");
		String nomeDaClasse = "br.com.listagens.mvc.logica." + parametro;

		try {
			
			Class classe = Class.forName(nomeDaClasse);
			Logica logica = (Logica) classe.newInstance();

			String pagina = logica.executa(req, resp);
			
			req.getRequestDispatcher(pagina).forward(req, resp);

		} catch (Exception e) {
			throw new ServletException("A lógica de negócios causou uma exceção", e);

		}

	}

}

Remove Contatos

public class RemoveAlunosLogic implements Logica{

   public String executa(HttpServletRequest req, HttpServletResponse res)
		throws Exception {
	
		int id = Integer.parseInt(req.getParameter("id"));
		
		Aluno aluno = new Aluno();
		aluno.setId(id);
		
		AlunoDao alunoDao = new AlunoDao();
		
		alunoDao.removeAluno(aluno);
		
		System.out.println("Excluindo Aluno... ");
	
			return "mvc?logica=ListaAlunosLogic";
			
    }
}

Classe Lista contatos

public class ListaAlunosLogic implements Logica{

	
	public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		
		ArrayList<Aluno> alunos =  new AlunoDao().getListarAlunos();
		
		req.setAttribute("Alunos", alunos);
			
		return "nova-lista.jsp";
	}
	
}

Classe Lista-contatos

<title>Alunos Cadastrados</title>
</head>
<body>

	<c:import url="cabecalho.jsp" />

	<!-- cria o DAO -->
	
	
	<table border="1">

		<!-- percorre contatos montando as linhas da tabela -->

		<tr>
			<th>Nome</th>
			<th>Data Nasc</th>
			<th>Email</th>
			<th>Telefone</th>
			<th>Endereço</th>
			<th>Remover</th>
		</tr>

		<c:forEach var="aluno" items="${alunos}">

			<tr>
				<td>${aluno.nome}</td>
				
				<td><fmt:formatDate value="${aluno.datanasc.time}"
						pattern="dd/MM/yyyy" /></td>

				<td>
				<c:if test="${not empty aluno.email}">
						<a href="malito:{alunno.email}"> ${aluno.email} </a>
						
					</c:if> <c:if test="${empty aluno.email}">
					Email não informado!
				</c:if>
				</td>

				<td>${aluno.telefone}</td>
				<td>${aluno.endereco}</td>
				
				<td>
					<a href="mvc?logica=RemoveAlunosLogic&id=${aluno.id}">Remover</a></a>
				</td>
				
			</tr>

		</c:forEach>
	</table>

	<c:import url="rodape.jsp" />

</body>
</html>

Observação: os nomes das classes e dos dados estão diferentes por opção, mas, a lógica é a mesma da apostila. Não consigo entender onde está o erro, se eu instanciar a classe DAO da forma antiga (<jsp:useBean id="dao" class="br.com.caelum.agenda.dao.ContatoDao" />) os dados são listados corretamente.

Olá,
a lista está vindo da AlunoDao?
Poste o código desta classe então, pra ver se o problema é la.

Olá Rodrigo_Void,

public ArrayList getListarAlunos(){

	try {
		
		ArrayList<Aluno> listadeAlunos = new ArrayList<Aluno>();
		
		String sqlList = "select * from alunos";
		
		PreparedStatement stm = (PreparedStatement) connection.prepareStatement(sqlList);
		ResultSet rs = (ResultSet) stm.executeQuery();
		
		while (rs.next()) {
			
			Aluno aluno = new Aluno();
			
			aluno.setId(rs.getInt("id"));
			aluno.setNome(rs.getString("nome"));
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("datanasc"));
			aluno.setDatanasc(data);
			aluno.setEmail(rs.getString("email"));
			aluno.setTelefone(rs.getString("telefone"));
			aluno.setEndereco(rs.getString("endereco"));
			
			listadeAlunos.add(aluno);	
			
		}
		
		rs.close();
		stm.close();
		return listadeAlunos;
		
	} catch (Exception e) {

		throw new RuntimeException(e);
		
	}
	
}

public void removeAluno(Aluno aluno){
	
	String sqlRemove = "delete from alunos where id=?";
	
	try {
		
		PreparedStatement stm = (PreparedStatement)     connection.prepareStatement(sqlRemove);
		stm.setInt(1, aluno.getId());
		stm.execute();
		stm.close();
		
	} catch (SQLException e) {

		throw new RuntimeException(e); 
	} 
	
}

}

Segue os métodos, ListarAlunos e RemoverAlunos.

	<jsp:useBean id="dao" class="br.com.listagens.dao.AlunoDao" />
	
<table border="1">

	<!-- percorre contatos montando as linhas da tabela -->

	<tr>
		<th>Nome</th>
		<th>Data Nasc</th>
		<th>Email</th>
		<th>Telefone</th>
		<th>Endereço</th>
		<th>Remover</th>
	</tr>

	<c:forEach var="aluno" items="${dao.listarAlunos}">

		<tr>
			<td>${aluno.nome}</td>
			
			<td><fmt:formatDate value="${aluno.datanasc.time}"
					pattern="dd/MM/yyyy" /></td>

e etc… FUNCIONA PERFEITAMENTE! Consigo listar, excluir e tudo mais.

Porém, quando retiro a instancia da classe Dao e coloco a lista passada na classe ListaAlunosLogic anteriormente mostrada, a página não mostra mais a lista, só a tabela vazia.

	<!-- percorre contatos montando as linhas da tabela -->

	<tr>
		<th>Nome</th>
		<th>Data Nasc</th>
		<th>Email</th>
		<th>Telefone</th>
		<th>Endereço</th>
		<th>Remover</th>
	</tr>

	<c:forEach var="aluno" items="${alunos}">

etc…

Tenta trocar
req.setAttribute("Alunos", alunos);
por
req.setAttribute("alunos", alunos);

Rodrigo_Void,

Valew cara, aparentemente era isso mesmo!

Quando alterei “Alunos” para “alunos” a lista apareceu.
Muita falta de atenção e experiência da minha parte, mas mto obrigado mesmo!

Vou tentar ter mais atenção e redobrar os estudos. Foco total! valew msm e até a próxima!!!

Estou reabrindo o forum, pois no meu caso ta igual a vc. Mas nao roda. Pode me ajudar?

Classe ControllerServlet

package br.com.caelum.mvc.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.mvc.logica.Logica;

@WebServlet("/mvc")
public class ControllerServlet extends HttpServlet {
	protected void service(HttpServletRequest request,
			HttpServletResponse response)
			throws ServletException, IOException {
		
		String parametro = request.getParameter("logica");
		String nomeDaClasse = "br.com.caelum.mvc.logica." + parametro;
		
		try {
			Class classe = Class.forName(nomeDaClasse);
			
			Logica logica = (Logica) classe.newInstance();
			String pagina = logica.executa(request, response);
			
			request.getRequestDispatcher(pagina).forward(request, response);
			
		} catch (Exception e) {
			throw new ServletException("A lógica de negócios causou uma exceção", e);
		}
	}
}

Remover Contatos

package br.com.caelum.mvc.logica;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.agenda.dao.ContatoDao;
import br.com.caelum.agenda.modelo.Contato;

public class RemoveContatoLogic implements Logica {
	
	public String executa(HttpServletRequest req, HttpServletResponse res)
			throws Exception {
		
		long id = Long.parseLong(req.getParameter("id"));
		
		Contato contato = new Contato();
		contato.setId(id);
		
		ContatoDao dao = new ContatoDao();
		dao.remove(contato);
		
		System.out.println("Excluindo contato...");
		
		return "lista-contatos.jsp";
	}
}

Classe ListaContatosLogic

package br.com.caelum.mvc.logica;

import java.awt.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.caelum.mvc.logica.Logica;

import br.com.caelum.agenda.dao.ContatoDao;
import br.com.caelum.agenda.modelo.Contato;

public class ListaContatosLogic implements Logica {
	public String executa(HttpServletRequest req, HttpServletResponse res) 
			throws Exception {
		
		List<Contato> contatos = new ContatoDao().getLista();
		req.setAttribute("contatos", contatos);
		return "lista-contatos.jsp";
	}
}

Lista Contatos.jsp

<%@ page import="br.com.caelum.agenda.modelo.Contato"%>
<%@ page import="br.com.caelum.agenda.dao.ContatoDao"%>
<%@ page import="java.awt.List"%>
<%@ page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://displaytag.sf.net" prefix="display" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
	<title>Lista Contatos</title>
	</head>
<body>
	
	<c:import url="cabecalho.jsp"></c:import>

<%-- 	<jsp:useBean id="dao" class="br.com.caelum.agenda.dao.ContatoDao"/> --%>
	
	<table align='center' cellspacing=2 cellpadding=5 border=1>
	
			<tr style="background: #e6e6fa">
				<th>ID</th>
				<th>Nome</th>
				<th>Email</th>
				<th>Endereço</th>
				<th>Data de Nascimento</th>
			</tr>

<%-- 		<c:forEach var="contato" items="${dao.lista }"> --%>
	<c:forEach var="contato" items="${contatos }">
		
			<tr>	
				<td>${contato.id }</td>
				<td>${contato.nome }</td>
 				<td>
					<c:if test="${not empty contato.email }">
						<a href="mailto:${contato.email}">${contato.email }</a>
							</c:if>
							
							<c:if test="${empty contato.email }">
 								Email não informado
							</c:if>
 				</td>
				<td>${contato.endereco }</td>
 				<td align="center"><fmt:formatDate value="${contato.dataNascimento.time }" pattern="dd/MM/yyyy"/></td>
				<td><a href ="mvc?logica=RemoveContatoLogic&id=${contato.id}">Remover</a></td>
			</tr>
		</c:forEach>
	</table> 	

	<c:import url="rodape.jsp"/>
	
</body>
</html>

O que há algo errado? :frowning:

Alguem???

Se o caso é igual, a solução está ai pra cima.
Se não é igual aqui não é lugar, cria seu tópico.