Caelum FJ21

Estou com o seguinte problema ao adicionar um contato na minha lista, o capítulo onde estou estudando é esse : https://www.caelum.com.br/apostila-java-web/servlets/#para-saber-mais-web-servlet-e-initparam-annotation

java.lang.NullPointerException
br.com.devcruz.dao.ContatoDAO.adiciona(ContatoDAO.java:36)
br.com.devcruz.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:53)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Alguém pode me ajudar com o erro?

O link ta errado, link certo: https://www.caelum.com.br/apostila-java-web/servlets/#para-saber-mais-web-servlet-e-initparam-annotation

Classe ContatoDAO

package br.com.devcruz.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import br.com.devcruz.factory.ConnectionFactory;
import br.com.devcruz.modelo.Contato;

public class ContatoDAO {

private Connection connection;

public ContatoDAO() {
try {
this.connection = new ConnectionFactory().getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void adiciona(Contato contato) {

  String sql = "insert into contatos (nome, email, endereco, dataNascimento) values (?,?,?,?)";

    try {

        PreparedStatement ps = connection.prepareStatement(sql);
        ps.setString(1, contato.getNome());
        ps.setString(2, contato.getEmail());
        ps.setString(3, contato.getEndereco());
        ps.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
        ps.execute();

    } catch (SQLException e) {

        throw new RuntimeException(e);

    }
}

public List getListaContatos() {
List contatos = new ArrayList();
Calendar dataNascimento = Calendar.getInstance();

  try {
  	PreparedStatement stmt = 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"));

  		dataNascimento.setTime(rs.getDate("dataNascimento"));
  		contato.setDataNascimento(dataNascimento);

  		contatos.add(contato);

  	}

  	return contatos;

  } catch (SQLException ex) {
  	Logger.getLogger(ContatoDAO.class.getName()).log(Level.SEVERE, null, ex);

  }

  return null;

}

}
Classe AdicionaContatoServlet

package br.com.devcruz.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

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.devcruz.dao.ContatoDAO;
import br.com.devcruz.modelo.Contato;

@WebServlet("/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {

  PrintWriter out = response.getWriter();

  
  String nome = request.getParameter("nome");
  String endereco = request.getParameter("endereco");
  String email = request.getParameter("email");
  String dataEmTexto = request.getParameter("dataNascimento");
  Calendar dataNascimento = null;

  
  try {
  	Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
  	dataNascimento = Calendar.getInstance();
  	dataNascimento.setTime(date);
  } catch (ParseException e) {
  	out.println("Erro de conversão da data");
  	return; 
  }

  
  Contato contato = new Contato();
  contato.setNome(nome);
  contato.setEndereco(endereco);
  contato.setEmail(email);
  contato.setDataNascimento(dataNascimento);

  ContatoDAO dao = new ContatoDAO();
  dao.adiciona(contato);


  out.println("<html>");
  out.println("<body>");
  out.println("Contato " + contato.getNome() + " adicionado com sucesso");
  out.println("</body>");
  out.println("</html>");

}
}