Problema com Servlet

Pessoal
Estou estudando Java Web, e estou com problemas em uma app web simples de cadastro que eu estou desenvolvendo seguindo meu material de estudos.

Criei um formulário de cadastro e quero que esse formulário salve os dados na minha base de dados do mysql:

Contato.java
package br.com.cognizant.modelo;

public class Contato {

private Long id;
private String nome;
private String email;
private String endereco;

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

}

ContatoDao.java
package br.com.cognizant.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

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

public class ContatoDao {

private Connection connection;

public ContatoDao() throws ClassNotFoundException, SQLException {
	this.connection = new ConnectionFactory().getConnection();
}

/* METODO PRA GRAVAR CONTATOS */
public void adiciona(Contato contato) {
	String sql = "insert into contatos " + "(nome,email,endereco)" + " values (?,?,?)";
	try {
		// prepared statement para inserção
		PreparedStatement stmt = (PreparedStatement) connection.prepareStatement(sql);
		// seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		// executa
		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

/* METODO PRA CARREGAR LISTA DE CONTATOS */
public List<Contato> getLista() {
	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"));

			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		return contatos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

/* METODO PRA ALTERAR CONTATO */
public void altera(Contato contato) {
	String sql = "update contatos set nome=?, email=?, endereco=? 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.setLong(4, contato.getId());

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

/* METODO PRA REMOVER CONTATO */
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);
	}
}

}

adiciona-contato.html

<?xml version="1.0" encoding="ISO-8859-1" ?> Cadastro

Adiciona Contatos


Nome:
E-mail:
Endereço:
		<input type="submit" value="Gravar" />
	</form>
</body>

AdicionaContatoServlet
package br.com.cognizant.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

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

@WebServlet("/adicionaContato")
public class AdicionaContatoServlet extends HttpServlet {
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");

	// monta um objeto contato
	Contato contato = new Contato();
	contato.setNome(nome);
	contato.setEndereco(endereco);
	contato.setEmail(email);

	// salva o contato
	try {
		ContatoDao dao = new ContatoDao();
		dao.adiciona(contato);
	} catch (ClassNotFoundException | SQLException e1) {
		e1.printStackTrace();
	}

	// 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>");

}

}

Gostaria que o meu botão gravar acionasse a servlet pra poder salvar o contato no banco de dados mas dá um erro genérico de:

HTTP Status 404 - /agenda/adicionarContato
type Status report
message /agenda/adicionarContato
description The requested resource is not available.
Apache Tomcat/7.0.88

Podem me ajudar?

Vamos lá, teu projeto se chama agenda? Se sim e você está “navegando” em qualquer página dentro deste projeto, o modo de acesso à servlet será

action="adicionaContato"
1 curtida

Bom dia Darlan
O meu action da página já está assim. Deve ter cortado na publicação:

<body>
	<h1>Adiciona Contatos</h1>
	<hr />
	<form action="adicionaContato">
		Nome: <input type="text" name="nome" /><br />
		E-mail: <input type="text" name="email" /><br />
		Endereço: <input type="text" name="endereco" /><br />

		<input type="submit" value="Gravar" />
	</form>
</body>

Olá amigo, oque você poderia fazer é startar seu projeto no modo debug e colocar um breakPoint na sua servlet, ai depende da sua IDE se for eclipse deve ter lar um “inseto verde” para iniciar no modo debug, depois de iniciado coloco um breakpoint na primeira linha do método service.

Caso a requisição não chegar no teu beck-end, quer dizer que a uri está errada, ai voce vai depurando e corrigindo as coisas.

Isso já está dizendo que está tentando acessar uma URL que não existe, não precisa de debug para ver isso.
Debug funciona quando você acessa a servlet, mas ela está estourando erro, executando algo erroneamente ou mesmo se você deseja validar o fluxo de informações.

Servlet é baseado em ações. A URL é só pra chegar no Servlet. Depois que chegar no Servlet ele vai verificar a ação que passou pra chegar no método (não é mágica, você é quem faz isso).
Na sua URL não tem /agenda/adicionarContato. Tem apenas /adicionarContato por isso está dando status 404 - Not Found.

Mas no seu caso, se você ajeitar a sua URL você vai chegar no método de adicionar porque está chamando o método direto no service, mas vi que ainda não tem uma conexão com o banco de dados criada. Mas faça por partes, primeiro entenda o problema de chegar na URL e depois que conseguir veja como fazer uma conexão.