[RESOLVIDO] Gravar dados no postgresql com servlets

27 respostas
E

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;

	}    
}

27 Respostas

E

Ajudem pfv

darlan_machado

Qual erro?

E

@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.

darlan_machado

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

E

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

darlan_machado

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

E

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

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

E

@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();
	}
}
darlan_machado

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

E

@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;
}
darlan_machado

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.

E

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.

darlan_machado

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.

E

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.

darlan_machado

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.

E

@darlan_machado como eu incluo a classe no debug

darlan_machado

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

E

Eclipse

darlan_machado

No eclipse, você só precisa ir até o código em questão e, na primeira linha com código válido (comentário não vale, declaração de variável não vale, try não vale…) abaixo da declaração do método, você vai dar um duplo clique na parte onde aparecem os números das linhas (à esquerda do código).
Feito isso, uma bolinha azul deve aparecer.
Aí, basta rodar o tomcat em modo debug (clicando naquele ícone que parece um bichinho - bug) e executar o código normalmente.
Quando o processo chegar à linha em questão, o eclipse irá suspender a thread, deixando aquela linha marcada e esperará você dar continuidade manualmente, através das teclas de função:
F6 - avança linha a linha (na verdade, parte a parte, pois ele pode saltar a mesma linha mais de uma vez).
F8 - Avança a execução até a próxima parada (próximo breakpoint ou fim do código).

E

deu erro novamente, tentando fazer esse processo. cara, no meu projeto nao tem nenhum main. como eu poderia adicionar o main ?
meu objetivo com esse projeto é aprender a usar o servlet para gravar no banco de dados. utilizando java para web, tomcat e postgresql. tentei seguir a apostila da caelum mas nao conseguir fluir muito.

darlan_machado

Cara, teu projeto é web, não é? Sendo assim, não vai existir um main.
Quem controla a execução da aplicação é o container (tomcat, no caso).

E

valeu por tentar ajudar… vou tentar resolver, se eu encontrar a solução, posto aqui.

darlan_machado

Não existe outra solução senão entender o ciclo de vida de uma aplicação web. Sem isso, você vai encontrar muitas dificuldades.

E

Conseguir resolver o problema, a questão era que eu não tava enxergando alguns detalhes que deveriam estar implementados, o driver do servlet eu nao tinha implementado no classpath. É por que existem dois drivers do servlet que devem ser colocados, o driver javax.servlet.jsp.jstl-1.2.2.jar e o driver javax.servlet.jsp.jstl-api-1.2.2.jar; eu estava colocando apenas o driver de nome -api.
Além disso existe também o driver que ja estavam: jstl-1.2.jar; jstl-impl-1.2.jar; standard-1.1.2.jar;
Agora foi.
Obrigado.

darlan_machado

Não são drivers e não são do servlet, são bibliotecas do JSTL.

E

Isso…

Criado 18 de fevereiro de 2019
Ultima resposta 22 de mar. de 2019
Respostas 27
Participantes 2