Erro na Servlet

25 respostas
augustopovoa

Estou aprendendo java (Servlets)
Pessoal ja consegui fazer uma servlet q pega os dados da tabela exibe dentro de jsp

Mais não consigo de jeito nenhum inserir um registro que vem de um jsp
Alguem por me ajudar por favor???
Não consigo encontrar este erro…

aparece este erro :
-------------------------------------------------------------------------------------
type Exception report

message 

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

exception 

javax.servlet.ServletException: Servlet execution threw an exception


root cause 

java.lang.NoClassDefFoundError: br/com/caelum/jdbc/dao/ContatoDAO
	br.com.caelum.servlet.teste4.doPost(teste4.java:54)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.12 logs.
-------------------------------------------------------------------------------------
Minha servlet :

package br.com.caelum.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

/**
 * Servlet implementation class for Servlet: teste4
 *
 */
 public class teste4 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public teste4() {
		super();
	}   	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}  	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String nome =  request.getParameter("nome");
		String email = request.getParameter("email");
		String endereco = request.getParameter("endereco");
		
		Contato contato = new Contato();
		contato.setNome(nome);
		contato.setEmail(email);
		contato.setEndereco(endereco);
		
		
			try {
				
				ContatoDAO dao = new ContatoDAO();	
				dao.adiciona(contato);
				
			} catch (SQLException e) {
				throw new ServletException(e);
				
			}
	}   	  	    
}
-------------------------------------------------------------------------------------
Meu jsp :

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="teste4.java" method="post">
	<input type="text" name="nome" value=""/>
	<input type="text" name="email" value=""/>
	<input type="text" name="endereco" value=""/>
	<input type="submit"  value="Enviar"/>
	
</form>
</body>
</html>
-------------------------------------------------------------------------------------
meu DAO:
package br.com.caelum.jdbc.dao;

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

import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;

public class ContatoDAO {

	private Connection connection;
	
	public ContatoDAO(Connection con){
		this.connection = con;
	}
	
	public ContatoDAO() throws SQLException {
		this.connection = ConnectionFactory.getConnection();		
	}
	
	public void adiciona(Contato contato) throws SQLException {
		
		// prepared Statement pra inserção
		PreparedStatement stmt = this.connection.prepareStatement("INSERT " +
				"INTO " +
				"contatos (nome, " +
				"email, " +
				"endereco) " +
				"VALUES " +
				"(?,?,?)");
		//seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		
		//execute
		stmt.executeUpdate();
		stmt.close();
		
		

	}
	
	public void remover(Contato registro) throws SQLException {
		
		PreparedStatement stmt = this.connection.prepareStatement("DELETE " +
				"FROM " +
				"contatos " +
				"WHERE " +
				"id=?");
		
		stmt.setLong(1, registro.getId());
		
		stmt.execute();
		stmt.close();
	}
	
	public List<Contato> getLista() throws SQLException {
		PreparedStatement stmt = this.connection.prepareStatement("SELECT " +
				"* " +
				"FROM " +
				"contatos");
		ResultSet rs = stmt.executeQuery();
		
		List<Contato> list = new ArrayList<Contato>();
		
		while (rs.next()){
			//criando o objeto Registro
			Contato registro = new Contato();
			registro.setNome(rs.getString("nome"));
			registro.setEmail(rs.getString("email"));
			registro.setEndereco(rs.getString("endereco"));
			
			//adicionando o objeto à lista
			list.add(registro);
		}
		
		rs.close();
		stmt.close();
		
		return list;
	}

	public List<Contato> pesquisar(Contato contato) throws SQLException{
		PreparedStatement stmt = this.connection.prepareStatement("SELECT " +
				"* " +
				"FROM " +
				"contatos " +
				"WHERE " +
				"id=?");
		stmt.setLong(1, contato.getId());
		
		ResultSet rs = stmt.executeQuery();
		
		List<Contato> list = new ArrayList<Contato>();
		
		while (rs.next()){
			//criando o objeto Registro
			Contato registro = new Contato();
			registro.setNome(rs.getString("nome"));
			System.out.println(registro.getNome());
			registro.setEmail(rs.getString("email"));
			registro.setEndereco(rs.getString("endereco"));
			
			//adicionando o objeto à lista
			list.add(registro);
		}
		
		rs.close();
		stmt.close();
		
		return list;
		
	}

}
-------------------------------------------------------------------------------------
meu bean:
package br.com.caelum.jdbc.modelo;

public class Contato {
	
	private Long id;
	private String nome;
	private String email;
	private String endereco;
	
	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 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;
	}
	
	


}

-------------------------------------------------------------------------------------e por fim rsrsrs … Meu web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>
	treinamento</display-name>
	<servlet>
		<description>
		</description>
		<display-name>
		OlaMundo</display-name>
		<servlet-name>OlaMundo</servlet-name>
		<servlet-class>
		br.com.caelum.servlet.OlaMundo</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>OlaMundo</servlet-name>
		<url-pattern>/OlaMundo</url-pattern>
	</servlet-mapping>
	
	<servlet>
		<description>
		</description>
		<display-name>
		TestaParametros</display-name>
		<servlet-name>TestaParametros</servlet-name>
		<servlet-class>
		br.com.caelum.servlet.TestaParametros</servlet-class>
	</servlet>
	<servlet>
		<description>
		</description>
		<display-name>
		TestaErro</display-name>
		<servlet-name>TestaErro</servlet-name>
		<servlet-class>
		br.com.caelum.servlet.TestaErro</servlet-class>
	</servlet>
	<servlet>
		<description>
		</description>
		<display-name>
		AdicionaContato</display-name>
		<servlet-name>AdicionaContato</servlet-name>
		<servlet-class>
		br.com.caelum.servlet.AdicionaContato</servlet-class>
	</servlet>
	<servlet>
		<description>
		</description>
		<display-name>
		ADD</display-name>
		<servlet-name>ADD</servlet-name>
		<servlet-class>
		br.com.caelum.servlet.ADD</servlet-class>
	</servlet>
	<servlet>
		<description>
		</description>
		<display-name>
		teste</display-name>
		<servlet-name>teste</servlet-name>
		<servlet-class>
		br.com.caelum.servlet.teste</servlet-class>
	</servlet>
	<servlet>
		<description>
		</description>
		<display-name>
		teste4.java</display-name>
		<servlet-name>teste4.java</servlet-name>
		<servlet-class>
		br.com.caelum.servlet.teste4</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>TestaParametros</servlet-name>
		<url-pattern>/TestaParametros</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>TestaErro</servlet-name>
		<url-pattern>/TestaErro</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>AdicionaContato</servlet-name>
		<url-pattern>/AdicionaContato</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>ADD</servlet-name>
		<url-pattern>/ADD</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>teste</servlet-name>
		<url-pattern>/teste.java</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>teste4.java</servlet-name>
		<url-pattern>/teste4.java</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>

MUITTTOO OBRIGADUUUUU

25 Respostas

TiagoFoil

Eu diria que vc esqueceu de mapear o ContatoDAO no seu web.xml.
Isso deve ser feito pra cada jsp e servlet usando a tag servlet-mapping.

Pedrosa

Edite seu post colocando a tag Code, fica mais legivel.

Rafael_Nunes

TiagoFoil:
Eu diria que vc esqueceu de mapear o ContatoDAO no seu web.xml.
Isso deve ser feito pra cada jsp e servlet usando a tag servlet-mapping.

Mas o DAO não é um servlet, para que ele precisaria mapear?

Não está encontrando a classe DAO.

Aliás, outra dúvida, se seu servlet já extende HttpServlet, pra que você está implementando Servlet também?
Obs: (HttpServlet extende GenericServlet que já implementa Servlet)

augustopovoa

TiagoFoil:
Eu diria que vc esqueceu de mapear o ContatoDAO no seu web.xml.
Isso deve ser feito pra cada jsp e servlet usando a tag servlet-mapping.

Desculpa não entendi muito bem… pode me dar um exemplo de como eu faço esse mapeamento?

augustopovoa

Desculpe mais não entendi muito bem, pode me dar um exemplo?
o q eu devo fazer no meu post?

augustopovoa

Rafael Nunes:
TiagoFoil:
Eu diria que vc esqueceu de mapear o ContatoDAO no seu web.xml.
Isso deve ser feito pra cada jsp e servlet usando a tag servlet-mapping.

Mas o DAO não é um servlet, para que ele precisaria mapear?

Não está encontrando a classe DAO.

Aliás, outra dúvida, se seu servlet já extende HttpServlet, pra que você está implementando Servlet também?
Obs: (HttpServlet extende GenericServlet que já implementa Servlet)

Então criei esse servlet pelo eclipse e ela me trouxe essa implementação automaticamente… devo tirar??

Rafael_Nunes

Eu particularmente não vejo necessidade para tal. De qualquer forma, a exceção que está lançando, é que não encontrou a sua classe DAO.

augustopovoa

Sabe como eu faço para ele encontrar ??? Está é a minha duvida…

Valew

TiagoFoil

Ops, desculpa! Viajei! ^^

o Dao nao tem q mapear mesmo nao. Vc tem q olhar em todos os lugares q vc digita o nome do dao se vc nao digitou errado. Talvez apenas um erro de digitação pode gerar esses erros “notfound” ou coisa do tipo… Ao menos comigo geralmente é isso.

Pedrosa

Realmente vc não precisa mapear suas clases DAO no web.xml, quando uso Servlet prefiro usar o metodo service, pois ele aceita os formularios com post ou get.

Exemplo:

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

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.pedrosa.dao.BolaoDAO;
import br.com.pedrosa.model.LoginBean;
import br.com.pedrosa.model.Palpite;
import br.com.pedrosa.model.Resultado;

public class BolaoAction extends HttpServlet { 
	
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
TiagoFoil

Já tentou tambem ir na linha 54 do arquivo “teste4.java” ??

augustopovoa
Pedrosa:
Realmente vc não precisa mapear suas clases DAO no web.xml, quando uso Servlet prefiro usar o metodo service, pois ele aceita os formularios com post ou get. Exemplo:
import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.pedrosa.dao.BolaoDAO;
import br.com.pedrosa.model.LoginBean;
import br.com.pedrosa.model.Palpite;
import br.com.pedrosa.model.Resultado;

public class BolaoAction extends HttpServlet { 
	
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

FIZ OUTRO USANDO O service olha :

package br.com.caelum.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

 public class AdicionaContato2 extends javax.servlet.http.HttpServlet{

	 /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		 	String nome =  request.getParameter("nome");
			String email = request.getParameter("email");
			String endereco = request.getParameter("endereco");
			
			Contato contato = new Contato();
			contato.setNome(nome);
			contato.setEmail(email);
			contato.setEndereco(endereco);
			
			
				try {
					
					ContatoDAO dao = new ContatoDAO();	
					dao.adiciona(contato);
					
				} catch (SQLException e) {
					throw new ServletException(e);
					
				}
					
			// recebe o Writer
			 PrintWriter writer = response.getWriter();
			 
			// escreve o writer
			 writer.println("<html>");
			 writer.println("EXPLICA O PARAMETRO: " + request.getParameter("nome"));
			 writer.println("</html>");
			 
	}   	  	    

	   	  	    
}

apareceu o mesmo erro :

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: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: br/com/caelum/jdbc/dao/ContatoDAO
br.com.caelum.servlet.AdicionaContato2.service(AdicionaContato2.java:35)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.12 logs.

Pedrosa

Não esta encontrando a classe DAO, verifique se o .class esta no diretorio classes da sua aplicação, e no extends nao precisa colocar o caminho completo da classe javax.servlet.http.HttpServlet use assim:

public class AdicionaContato2 extends HttpServlet{
augustopovoa

TiagoFoil:
Já tentou tambem ir na linha 54 do arquivo “teste4.java” ??

já é a linha: ContatoDAO dao = new ContatoDAO();

augustopovoa

Pedrosa:
Não esta encontrando a classe DAO, verifique se o .class esta no diretorio classes da sua aplicação, e no extends nao precisa colocar o caminho completo da classe javax.servlet.http.HttpServlet use assim:

public class AdicionaContato2 extends HttpServlet{

agora o erro foi la dentro do DAO:

na linha :

this.connection = ConnectionFactory.getConnection();
Pedrosa

Veja se sua conexão está ok na classe ConnectionFactory, poste ela ai.

augustopovoa

tah aki

package br.com.caelum.jdbc;

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

import com.mysql.jdbc.Connection;

public class ConnectionFactory {

private static final String URL = "jdbc:mysql://localhost/teste";
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String USUARIO = "root";
private static final String SENHA = "";

public static Connection getConnection() throws SQLException {
	try{
		Class.forName(DRIVER);
		System.out.println("Conectando ao Banco");
		return (Connection) DriverManager.getConnection(URL, USUARIO, SENHA);
	}catch (ClassNotFoundException e) {
		throw new SQLException(e.getMessage());
		
	}

}

}

augustopovoa

A chamada aki na DAO tah certa?

package br.com.caelum.jdbc.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;

public class ContatoDAO {

private Connection connection;

public ContatoDAO(Connection con){
	this.connection = con;
}

public ContatoDAO() throws SQLException {
	try {
		this.connection = ConnectionFactory.getConnection();	
	} catch (SQLException e) {
		e.printStackTrace();
		
	}
			
}

public void adiciona(Contato contato) throws SQLException {
	
	// prepared Statement pra inserção
	PreparedStatement stmt = this.connection.prepareStatement("INSERT " +
			"INTO " +
			"contatos (nome, " +
			"email, " +
			"endereco) " +
			"VALUES " +
			"(?,?,?)");
	//seta os valores
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getEmail());
	stmt.setString(3, contato.getEndereco());
	
	//execute
	stmt.executeUpdate();
	stmt.close();
	
	

}

public void remover(Contato registro) throws SQLException {
	
	PreparedStatement stmt = this.connection.prepareStatement("DELETE " +
			"FROM " +
			"contatos " +
			"WHERE " +
			"id=?");
	
	stmt.setLong(1, registro.getId());
	
	stmt.execute();
	stmt.close();
}

public List<Contato> getLista() throws SQLException {
	PreparedStatement stmt = this.connection.prepareStatement("SELECT " +
			"* " +
			"FROM " +
			"contatos");
	ResultSet rs = stmt.executeQuery();
	
	List<Contato> list = new ArrayList<Contato>();
	
	while (rs.next()){
		//criando o objeto Registro
		Contato registro = new Contato();
		registro.setNome(rs.getString("nome"));
		registro.setEmail(rs.getString("email"));
		registro.setEndereco(rs.getString("endereco"));
		
		//adicionando o objeto à lista
		list.add(registro);
	}
	
	rs.close();
	stmt.close();
	
	return list;
}

public List<Contato> pesquisar(Contato contato) throws SQLException{
	PreparedStatement stmt = this.connection.prepareStatement("SELECT " +
			"* " +
			"FROM " +
			"contatos " +
			"WHERE " +
			"id=?");
	stmt.setLong(1, contato.getId());
	
	ResultSet rs = stmt.executeQuery();
	
	List<Contato> list = new ArrayList<Contato>();
	
	while (rs.next()){
		//criando o objeto Registro
		Contato registro = new Contato();
		registro.setNome(rs.getString("nome"));
		System.out.println(registro.getNome());
		registro.setEmail(rs.getString("email"));
		registro.setEndereco(rs.getString("endereco"));
		
		//adicionando o objeto à lista
		list.add(registro);
	}
	
	rs.close();
	stmt.close();
	
	return list;
	
}

}

Pedrosa

Parece estar ok, coloque o erro completo.

augustopovoa

type Exception report

message

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

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: br/com/caelum/jdbc/ConnectionFactory

br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:23)

br.com.caelum.servlet.AdicionaContato2.service(AdicionaContato2.java:37)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.12 logs.

augustopovoa


type Exception report

message

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

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: br/com/caelum/jdbc/ConnectionFactory

br.com.caelum.jdbc.dao.ContatoDAO.(ContatoDAO.java:23)

br.com.caelum.servlet.AdicionaContato2.service(AdicionaContato2.java:37)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.12 logs.

Pedrosa

Mesma coisa não está encontrando o .class do ConnectionFactory olhe la no seu diretorio classes.

augustopovoa

Vc acha que pode ser o tomcat?

augustopovoa

Vc acha que pode ser o tomcat?

será q ele tah ruim???

TiagoFoil

tá com cara de ser problema com o local onde seu .class está mesmo, vai mudando ele de lugar la nas pastas do tomcat, pega um exemplo do tomcat mesmo e olha a estrutura de arquivos e o que tem em cada pasta. Se a sua tiver igual e ainda nao funcionar nao sei o q pode ser.

Criado 24 de abril de 2006
Ultima resposta 25 de abr. de 2006
Respostas 25
Participantes 4