[RESOLVIDO] Gravar dados no postgresql com servlets

Nao estou conseguindo gravar no banco de dados, através de servlets, to utilizando o tutorial da caelum, mas não vai de jeito nenhum. Da na classe ContatoDao em:

PreparedStatement stmt = connection.prepareStatement(sql);

e da erro em AdicionaContatoServlet em: dao.adiciona(contato);

classe: AdicionaContatoServlet

import java.io.IOException;
import java.io.PrintWriter;
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;

@WebServlet("/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response)
				   throws IOException, ServletException{
	
		//busca o writer
		PrintWriter out = response.getWriter();
		
		//buscando os parâmetros no request
		String nome = request.getParameter("nome");
		String endereco = request.getParameter("endereco");
		String email = request.getParameter("email");
		String dataEmTexto = request.getParameter("dataNascimento");
		Calendar dataNascimento = null;
		
	//fazendo a conversão da data
	
	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 de data");
		return; //para a execução do método 
		
	}
	
	//monta um objeto contato
	
	Contato contato = new Contato();
	contato.setNome(nome);
	contato.setEndereco(endereco);
	contato.setEmail(email);
	contato.setDataNascimento(dataNascimento);

	//salva o contato
	ContatoDao dao = new ContatoDao();
	dao.adiciona(contato);
	

	// imprime o nome do contato que foi adicionado
	out.println("<html>");
	out.println("<body>");
	out.println("Contato " + contato.getNome() + " adicionado com sucesso");
	out.println("</body>");
	out.println("</html>");

	}
}

Classe: ContatoDao

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;

public class ContatoDao {

	 // a conexão com o banco de dados
	private Connection connection;

	public ContatoDao() {
		try {
			this.connection = Conectou.criarConexao();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 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 {
			// prepared statement para inserção
			PreparedStatement stmt = connection.prepareStatement(sql);

			// seta os valores
			stmt.setString(1,contato.getNome());
			stmt.setString(2,contato.getEmail());
			stmt.setString(3,contato.getEndereco());
			stmt.setDate(4, new Date(
			contato.getDataNascimento().getTimeInMillis()));

			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<Contato> getLista() {
		try {
			ArrayList<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement stmt = this.connection.
			prepareStatement("select * from contatos");
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				// criando o objeto Contato
				Contato contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));

				// montando a data através do Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);

				// adicionando o objeto à lista
				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 = 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 = connection.prepareStatement("delete from contatos where id=?");
			stmt.setLong(1, contato.getId());
			stmt.execute();
			stmt.close();    
			
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	
	}
	
   }

classe: Contato

import java.util.Calendar;

public class Contato{

	private Long id;
	private String nome;
	private String email;
	private String endereco;
	private Calendar dataNascimento;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Calendar getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

}

classe: conectou

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Conectou {

	static final String URL = "jdbc:postgresql://localhost:5432/Categoria"; //indica o caminho do banco de dados
	static final String USER = "postgres"; // aqui vai o nome usuario que vc quer acessar
	static final String PASS = "treinamentosig"; // aqui a senha do seu banco
 
	public static Connection criarConexao() throws ClassNotFoundException, SQLException{
	Class.forName("org.postgresql.Driver"); //aponta para o driver
	Connection conectou = DriverManager.getConnection(URL, USER, PASS); //acesso ao driver com os dados deste
	if (conectou != null){ //verifica acesso ao driver.
	System.out.print("Conexão efetuada com sucesso, parabens. \n");
	return conectou;
	}
	return null;

	}    
}  

Ajudem pfv

Qual erro?

@darlan_machado esse erro:

Type Exception Report

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

java.lang.NullPointerException Saudacao.ContatoDao.adiciona(ContatoDao.java:35) Saudacao.AdicionaContatoServlet.service(AdicionaContatoServlet.java:53) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Note The full stack trace of the root cause is available in the server logs.

E o que você entendeu desse erro?
Eu entendo que, na linha 35 da classe ContatoDao, você está tendo um null pointer exception.

pelo q pesquisei, é a respeito de não ter instaciado ou inicializado algum objeto. mas nao consigo enxergar isso no codigo.

Coloca a linha em questão aí. Se possível, coloca o método e só indica qual a linha

public void adiciona(Contato contato) {
String sql = “insert into contatos " + “(nome,email,endereco,dataNascimento)” + " values (?,?,?,?)”;

    try {
    	// prepared statement para inserção; linha que da erro é essa que utilizo o preparedstatement 
        PreparedStatement stmt = connection.prepareStatement(sql);

        // seta os valores
        stmt.setString(1,contato.getNome());
        stmt.setString(2,contato.getEmail());
        stmt.setString(3,contato.getEndereco());
        stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));

        // executa
        stmt.execute();
        stmt.close();
    } catch (SQLException e) {
    	throw new RuntimeException(e);        }
}

Provavelmente você não está inicializando o objeto connection, ele está nulo.

@darlan_machado eu inicializei aqui:
public class ContatoDao {

 // a conexão com o banco de dados
private Connection connection; //inicialização do connection;

public ContatoDao() {
    try {
		this.connection = Conectou.criarConexao();
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

E como está o método criarConexao na classe Conectou (belo nome para uma classe, hein?)?

@darlan_machado aqui esta o método:

public static Connection criarConexao() throws ClassNotFoundException, SQLException{
Class.forName(“org.postgresql.Driver”); //aponta para o driver
Connection conectou = DriverManager.getConnection(URL, USER, PASS); //acesso ao driver com os dados deste
if (conectou != null){ //verifica acesso ao driver.
System.out.print(“Conexão efetuada com sucesso, parabens. \n”);
return conectou;
}
return null;

}

Eu acredito que não está entrando no if.
Além disso, eu colocaria um

else {
    throw new SQLException("Não houve conexão");
}

Você mataria essa charada com extrema facilidade caso você tivesse debugado o código.

continua dando o mesmo erro, mesmo após acrescentar o else.
debuguei a classe conectou e veio isso como erro: The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

Cara, coloque isso na tua cabeça: existe uma exceção que diz que você tem algo nulo e está tentando usar um recurso desse algo.
Esse algo, no caso, é o objeto connection.
Este objeto, teoricamente, é criado a partir da invocação do método criarConexao
A única possibilidade de retorno de um valor nulo neste método, até então, era não ser percorrido o trecho de código dentro do if(conectou != null)
A inclusão do else com o throw da exceção deveria, portanto, lançar uma exceção com a mensagem “Não houve conexão” e a mesma seria capturada pelo try/catch do construtor da classe ContatoDao.

Esse erro é referente ao tomcat.
Não sei como você está tentando fazer isso, mas, o certo é, a cada modificação nos arquivos .java (ou melhor, em tudo que não está no WebContent), você para e reinicia o mesmo.

Então esse erro tem mais haver com a classe conectou do que com a classe ContatoDao.

Eu faço isso @darlan_machado, a cada modificação nos arquivos eu reinicio o servidor do tomcat.

Um dos princípios básicos do desenvolvimento orientado a objetos é a premissa de criar classes especializadas.
Cada classe faz sua parte.
Assim sendo, você tem uma classe que faz a conexão com o banco de dados. Ela deveria, também, ser incluída no teu debug. Assim você teria como identificar se é ali que ocorre a exceção e por que.

@darlan_machado como eu incluo a classe no debug

Está usando qual ide para desenvolver? Eclipse? Netbeans? IntelliJ?

Eclipse