Problemas com a apostila FJ21 - Java Web

Boa tarde pessoal.

Estou a alguns dias tendo alguns problemas com exercícios da apostila FJ 21, “Java para Desenvolvimento Web”, da Caelum.

Além de realizar os exercicios que a apostila me propunha, eu coloquei também um pouco de Bootstrap, para o visual ficar mais “apresentável”, mas até então não havia tido problema algum com as conexão.

Porém, de uns dias para cá, eu entrei no capitulo de MVC e puf, minhas servlets pararam de funcionar. Desde as que eu já havia colocado no começo da apostila, quanto as novas.
Minha página JSP que lista os contatos também parou de funcionar, tudo, “aparentemente” porque não estão encontrando as classes.

(Não estou conseguindo colocar os codes certos, o botão “code” sumiu)

Erro:

dez 23, 2015 7:49:57 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [jsp] in context with path [/fj21-agenda] threw exception [javax.servlet.ServletException: java.lang.NoClassDefFoundError: dao/ContatoDao] with root cause
java.lang.ClassNotFoundException: dao.ContatoDao
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
	at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:125)
	at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:62)
	at org.apache.jsp.lista_002dcontatos_002delegante_jsp._jspService(lista_002dcontatos_002delegante_jsp.java:144)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
	id="WebApp_ID" 
	version="3.1">
  <display-name>fj21-agenda</display-name>
  <welcome-file-list>
		<welcome-file>bemvindo.jsp</welcome-file>
  </welcome-file-list>
  
  <error-page>
  	<exception-type>java.lang.Exception</exception-type>
  	<location>/erro.jsp</location>
  </error-page>
  
  <error-page>
  	<error-code>404</error-code>
  	<location>/404.jsp</location>
  </error-page>
  
  
  <servlet>
  	<servlet-name>controlador</servlet-name>
  	<servlet-class>mvc.servlet.ControllerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>controlador</servlet-name>
  	<url-pattern>/mvc</url-pattern>
  </servlet-mapping>
  
  
  <servlet>
  	<servlet-name>AdicionaContato</servlet-name>
  	<servlet-class>servlet.AdicionaContatoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>AdicionaContato</servlet-name>
  	<url-pattern>/adicionaContato</url-pattern>
  </servlet-mapping>
  
</web-app>

ContatoDao:

package dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.sql.Date;
import java.util.List;

import com.mysql.jdbc.PreparedStatement;

import jdbc.ConnectionFactory;
import modelo.Contato;

public class ContatoDao {
	
	private Connection connection;
	
	public ContatoDao(){
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Contato contato){
		String sql = "insert into contatos (nome, email, endereco, dataNascimento) values (?, ?, ?, ?)";
		
		try {
			PreparedStatement stmt = (PreparedStatement) connection.prepareStatement(sql);
			
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			stmt.execute();
			stmt.close();
		} catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	public List<Contato> getList(){
		try {
			List<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement stmt = (PreparedStatement) this.connection.prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()){
				
				Contato contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				contatos.add(contato);
			}
			rs.close();
			stmt.close();
			return contatos;
		} catch(SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public void altera(Contato contato){
		String sql = "update contatos set nome=?, email=?, endereco=?, dataNascimento=? where id=?";
		
		try {
			PreparedStatement stmt = (PreparedStatement) connection.prepareStatement(sql);
			stmt.setString(1, contato.getNome());
			stmt.setString(2,  contato.getEmail());
			stmt.setString(3,  contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			stmt.setLong(5, contato.getId());

			stmt.execute();
			stmt.close();
		
		} catch (SQLException e){
			throw new RuntimeException(e);
		}	
	}
	
	public void remove(Contato contato){
		try {
			PreparedStatement stmt = (PreparedStatement) connection.prepareStatement("delete from contatos where id=?");
			
			stmt.setLong(1, contato.getId());
			stmt.execute();
			stmt.close();		
			
		} catch (SQLException e){
			throw new RuntimeException(e);
			
		}
	}
}

Lista de Contatos:

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

<body>
<c:import url="barra_superior.jspf" />
<div class="container" style="padding-top: 80px;">
	
	<!--  cria o DAO -->
	<jsp:useBean id="dao" class="dao.ContatoDao" />
	
	<p><h1>Lista de contatos cadastrados</h1>
	
	<table class="table table-striped table-bordered">
		<!-- percorre contatos montando as linhas da tabela -->
			<tr>
			<th>Nome</th>
			<th>Email</th>
			<th>Endereço</th>
			<th>Data de Nascimento</th>
			</tr>
		<c:forEach var="contato" items="${dao.list}">
			<tr>
				<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><fmt:formatDate pattern="dd/MM/yyyy" type="date"
            			value="${contato.dataNascimento.time}" /></td>
			</tr>
		</c:forEach>
		
	</table>

</div>

</body>
</html>

Caso precisem de mais códigos, me avisem, por favor.

@gabztodaro, depois que mudamos o GUJ, alguns markdowns ficaram diferente mesmo. O botão code não existe mais, mas você pode colocar códigos usando `código agui` para trechos de código ou:

```
//código aqui
```

para blocos :smiley:

2 curtidas

Vou tentar alterar!