Problemas adicionar contato usando Tomcat

6 respostas
T

Olá como vão todos?
Estou tentando fazer uma página que adiciona contatos usando o Eclipse, Mysql e o Tomcat, mas quando clico no botão Gravar aparece uma tela de erro do Tomcat como esta:

HTTP Status 404 - Servlet AdicionaContato is not available

type Status report

message Servlet AdicionaContato is not available

description The requested resource (Servlet AdicionaContato is not available) is not available.

Apache Tomcat/6.0.24

Às vezes aparece esta também:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Class br.com.caelum.agenda.servlet.AdicionaContatoServlet is not a Servlet
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Unknown Source)
root cause

java.lang.ClassCastException: br.com.caelum.agenda.servlet.AdicionaContatoServlet cannot be cast to javax.servlet.Servlet
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Unknown Source)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.24 logs.

Segue também a Servlet Adiciona:

package br.com.caelum.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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.caelum.agenda.dao.ContatoDAO;
import br.com.caelum.agenda.modelo.Contato;

public class AdicionaContatoServlet {
	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>");
		
	}

}

E ConnectionFactory. Os dados de login do banco estão de acordo com os que configurei:

package br.com.caelum.agenda;

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

public class ConnectionFactory {

	public Connection getConnection() throws SQLException {
		System.out.println("conectando ...");

		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			throw new SQLException(e);
		}
		
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "123");
	}

}

Espero que alguém possa me ajudar e agradeço desde já, pois empaquei no estudo e não queria deixar isso pra trás.

6 Respostas

thiagotn

Mostre o código do seu web.xml e do formulário jsp.

T

Código XML.

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>fj21-agenda</display-name>
  <servlet>
    <servlet-name>AdicionaContato</servlet-name>
    <servlet-class>br.com.caelum.agenda.servlet.AdicionaContatoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AdicionaContato</servlet-name>
    <url-pattern>/adicionaContato</url-pattern>
  </servlet-mapping>
  <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>
  
</web-app>

Este é o código do formulário:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="adicionaContato">
	Nome: <input type="text" name="nome" /><br />
	Email: <input type="text" name="email" /><br />
	Endereço: <input type="text" name="endereco" /><br />
	Data Nascimento: <input type="text" name="dataNascimento" /><br />
	
	<input type="submit" value="Gravar" />
	
</form>
</body>
</html>
thiagotn

Não tinha olhada com calma sua classe AdicionaContatoServlet
Para que esta sua classe seja um Servlet é necessário usar

AdicionaContatoServlet extends HttpServlet

ou

AdicionaContatoServlet implements Servlet

Se usar a segunda opção, não esquece de implementar os métodos da interface Servelt. Pra descomplicar, use a primeira opção.

T

Era isso mesmo thiago. Obrigado.
Os erros pararam, mas quando tento adicionar dá erro na data que eu coloco. Já tentei todos os formatos.
Dá a mensagem do try/catch do código da Servlet, “Erro de conversão de data”.

Já olhei umas trocentas vezes o código.

O que será? Se não for abusar mais de vc ainda.

thiagotn

Ao invés deste trecho

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

sugiro isto

try {
			Date data = new Date(dataEmTexto);
		} catch (Exception e) {
			out.println("Erro de conversão de data");  
                        return; //para a execução do método
		}

e quando você precisar da data formatada:

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.format(data);
T

Deu certo.

Obrigado mais uma vez pela atenção, foi de uma ajuda muito grande.

Criado 16 de março de 2010
Ultima resposta 17 de mar. de 2010
Respostas 6
Participantes 2