Erro 404 - Apostila Caelum - adicionaContato

Estou com problema para resolver o erro. Já chequei varias vezes tudo que pensei que poderia causar o erro. Já tentei tentei de tudo e não encontrei o erro.

Pesquisei pelo erro e vi que muitas pessoas tiveram o mesmo problema mas não consegui solucionar o meu problema com base no problema deles.

Alguém pode me ajudar?

[color=red]Erro ao acessar: localhost:8080/fj21-agenda/adicionaContato[/color]

HTTP Status 404 - /fj21-agenda/adicionaContato

type Status report

message /fj21-agenda/adicionaContato

description The requested resource is not available.

Apache Tomcat/7.0.42

[color=red]adiciona-contato.html[/color]

<!DOCTYPE html>
<html>
	<head>
		<meta charset="US-ASCII">
		<title>Insere Contato</title>
	</head>
	<body>
		<form action="adicionaContato" method="POST">
			Nome: <input type="text" name="nome" /><br>
			E-Mail: <input type="text" name="email" /><br>
			Endereco: <input type="text" name="endereco" /><br>
			Data de Nascimento <input type="text" name="dataNascimento" /><br>
			
			<input type="reset" value="Limpar"/>
			<input type="submit" value="Gravar" />
		</form>

	</body>
</html>

[color=red]web.xml[/color]

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>fj21-agenda</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  
  <servlet>
  	<servlet-name>AdicionaContato</servlet-name>
  	<servlet-class>br.com.empresa.agenda.servlet.AdicionaContatoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>AdicionaContato</servlet-name>
  	<url-pattern>/adicionaContato</url-pattern>
  </servlet-mapping>
  
</web-app>

[color=red]AdiconaContatoServlet.java[/color]

[code]package br.com.empresa.agenda.servlet;

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.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.empresa.jdbc.dao.ContatoDao;
import br.com.empresa.jdbc.modelo.Contato;

public class AdicionaContatoServlet extends HttpServlet{

protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	
	// buca o writer
	PrintWriter out = response.getWriter();
	
	// parametros 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;
	
	// conversao 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 conversao da data");
		return;
	}
	
	
	//montando o objeto
	Contato contato = new Contato();
	
	contato.setNome(nome);
	contato.setEmail(email);
	contato.setEndereco(endereco);
	contato.setDataNascimento(dataNascimento);
	
	// insere o contato no db
	ContatoDao dao = new ContatoDao();
	dao.adiciona(contato);
	
	// informa que foi criado
	out.println("<html>");
	out.println("<head>");
	out.println("<title>Resultado - Insere</title>");
	out.println("</head>");
	out.println("<body>");
	out.println("Contato " + contato.getNome() + " inserido com sucesso!");
	out.println("</body>");
	out.println("</html>");
}

}
[/code]

[color=red]Contato.java[/color]

package br.com.empresa.jdbc.modelo;

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 this.id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getNome() {
		return this.nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return this.email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEndereco() {
		return this.endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Calendar getDataNascimento() {
		return this.dataNascimento;
	}
	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

}

[color=red]ContatoDao.java[/color]

package br.com.empresa.jdbc.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 br.com.empresa.jdbc.ConnectionFactory;
import br.com.empresa.jdbc.modelo.Contato;

public class ContatoDao {
	
	private Connection con;
	
	public ContatoDao() {
		this.con = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Contato contato) {
		String sql = "insert into contatos (nome,email,endereco,dataNascimento) values (?,?,?,?)";
		
		try {
			// prepared statement para insercao
			
			PreparedStatement stmt = con.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);
		}
	}
	
	public List<Contato> getLista() {
		try {
			List<Contato> contatos = new ArrayList<>();
			
			String sql = "select * from contatos";
			PreparedStatement stmt = this.con.prepareStatement(sql);
			
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				
				// criando 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 atraves do calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				// adiciona objeto
				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 = this.con.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()));
		
		// where
		stmt.setLong(5, contato.getId());
		
		stmt.execute();
		stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public void remove(Contato contato) {
		String sql = "delete from contatos where id=?";
		try {
			PreparedStatement stmt = this.con.prepareStatement(sql);
			
			// where
			stmt.setLong(1, contato.getId());
			
			stmt.execute();
			stmt.close();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public Contato pesquisa(long id) {
		String sql = "select * from contatos where id=?";
		
		try {
			PreparedStatement stmt = this.con.prepareStatement(sql);
			
			stmt.setLong(1, id);
			
			ResultSet rs = stmt.executeQuery();
			
			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);
			
			rs.close();
			stmt.close();
			
			return contato;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
		
	}

}

[color=red]ConnectionFactory.java[/color]

[code]package br.com.empresa.jdbc;

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

public class ConnectionFactory {
public Connection getConnection() {
try {
return DriverManager.getConnection(
“jdbc:mysql://localhost/fj21”,“root”,"");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}

}
[/code]

Você não tem um método doPost em tua servlet.

Bord,
Pela data dar para ver que não é recente a sua dúvida. Mas como não vi a resposta da solução, sendo assim postarei para você.
Pode ser que ajude a alguém.

No mapeamento do web.xml o correto é:

/adicionaContato

e não:

/AdicionaContato

o service atende tanto o doPost quanto o doGet,o mais provavel é que a url mapeada para o servlet não coincide com o action do formulario

[quote=nelsonflorencio]Bord,
Pela data dar para ver que não é recente a sua dúvida. Mas como não vi a resposta da solução, sendo assim postarei para você.
Pode ser que ajude a alguém.

No mapeamento do web.xml o correto é:

/adicionaContato

e não:

/AdicionaContato[/quote]
Não entendi tua observação, o web.xml do post está correto.
/adicionaContato

Usuário abandonou o post.

Outra causa possível é se o projeto não estiver com o nome “fj21-agenda”, certamente tomaria um 404.

Olá asousaj,
Realmente eu fui infeliz ao tentar ajudar o amigo.
É que eu ainda não tenho experiência em Java, pois estou aprendendo. E como também estou estudando a apostila FJ-21 e estava com a mesma dúvida, comecei a pesquisar para ver se encontrava a solução. E a solução que encontrei foi para verificar a forma como tinha colocado o nome entre a url-pattern. Daí notei que tinha usado a letra maiúscula ao invés de minúscula. Foi até falta de atenção mesmo, pois na apostila estava correto.

E agora também percebi que a url do amigo estava correta.
Foi mal, só queria ajudar.

nelsonflorencio, tranquilo.
Isso acontece mesmo.

Prezados,

Alguém conseguiu uma solução para este problema?

Estou com o mesmo problema ao tentar gravar um novo contato.

Abraço a todos