[RESOLVIDO]Dúvida Servlets

23 respostas
C

Olá Pessoal.
Estou estudando um pouco pela fj-21 e me deparei com o seguinte problema

type Exception report

message

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

exception

java.lang.NullPointerException
	java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
	java.text.DateFormat.parse(DateFormat.java:335)
	br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:27)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.22 logs.

Sei que este erro indica que algum atributo está sendo definido como nulo , mas não encontrei o problema no código.

package br.com.caelum.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;

public class AdicionaContatoServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		String nome = request.getParameter("nome");
		String endereco = request.getParameter("endereco");
		String email = request.getParameter("email");
		String dataEmTexto = request.getParameter("dataNascimento");
		Calendar dataNascimento = Calendar.getInstance();
		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 da data");
			return; // para a execução do método
		}
		Contato c1 = new Contato();
		c1.setNome(nome);
		c1.setEmail(email);
		c1.setEndereco(endereco);
		c1.setDataDeNascimento(dataNascimento);
		ContatoDAO dao = new ContatoDAO();
		dao.adicionar(c1);
		out.println("<html>");
		out.println("<body>");
		out.println("Contato " + c1.getNome() + " adicionado com sucesso");
		out.println("</body>");
		out.println("</html>");
	}

}

Pelo que entendi o problema deve ser ali na parte de trabalhar com as datas...

23 Respostas

getAdicted

Olá amigo,

Bota a sua JSP ai, onde você está digitando os dados.

[]'s

C

Então , estou seguindo os exercicios propostos pela fj-21 e ainda não foi criado nenhum JSP.

Esta servlet esta interagindo com um form de HTML.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <body>
    
        <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 />
            Data Nascimento: <input type="text" name="dataNascimento" /><br />
            <input type="submit" value="Gravar" />
        </form>
    </body>
</html>
getAdicted
CaioIncau:
Então , estou seguindo os exercicios propostos pela fj-21 e ainda não foi criado nenhum JSP.

Esta servlet esta interagindo com um form de HTML.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <body>
    
        <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 />
            Data Nascimento: <input type="text" name="dataNascimento" /><br />
            <input type="submit" value="Gravar" />
        </form>
    </body>
</html>

Correto,

Então você vai fazer o seguinte:

1 - Crie um diretório dentro de WEB-INF chamado tags. 2 - Dentro do diretório tags, crie um arquivo chamado campoData.tag e insira o seguinte cógido:
<%@ attribute name="id" required="true" %>
<script type="text/javascript">
    $(function() {
        $("#${id}").datepicker();
    });
</script>
<input type="text" id="${id}" name="${id}" />
3 - Sua JSP ficará dessa forma:
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib tagdir="/WEB-INF/tags" prefix="caelum" %>
<c:import url="cabecalho.jsp" />
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<form action="adicionaContato">
    Nome: <input type="text" name="nome" /><br />
    E-mail: <input type="text" name="email" /><br />
    Endereco: <input type="text" name="endereco" /><br />
    Data Nascimento: <caelum:campoData id="dataNascimento" /><br />
    <input type="submit" value="Gravar" />
</form>
<c:import url="rodape.jsp" />

Testa e qualquer coisa, avisa! :)

[]'s

Rodrigo_Sasaki

que valor está vindo na sua variável dataEmTexto na hora de chamar o método parse() do SimpleDateFormat ?

C

Dei uma editada e agora o problema mudou...

A questão das datas era que em no DAO estava como dataDeNascimento e nao dataNascimento.

Ja foi arrumado.

mas agora surgiu outro problema.

Pelo o que eu entendi ele não esta encontrando o driver do MySQL, mas eu ja adicionei ele ao ClassPath e copiei para a pasta Lib do TomCat

type Exception report

message

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

exception

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
	br.com.caelum.servlet.ConnectionFactory.getConnection(ConnectionFactory.java:16)
	br.com.caelum.servlet.ContatoDAO.<init>(ContatoDAO.java:19)
	br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:39)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
	java.sql.DriverManager.getConnection(DriverManager.java:602)
	java.sql.DriverManager.getConnection(DriverManager.java:185)
	br.com.caelum.servlet.ConnectionFactory.getConnection(ConnectionFactory.java:11)
	br.com.caelum.servlet.ContatoDAO.<init>(ContatoDAO.java:19)
	br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:39)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.22 logs.
Rodrigo_Sasaki

Aonde você cria a conexão com o banco de dados? Mostre pra gente o método.

Se você estiver usando JDBC 3 você precisa “declarar” o driver que está usando via Class.forName()

C

Estou usando um Connection Factory

package br.com.caelum.servlet;

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

public class ConnectionFactory {
	public Connection getConnection(){
	System.out.println("Conectando ao Banco de Dados ");
	try{
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "");
		
	}
	
	catch (SQLException e){
		throw new RuntimeException(e);
		
		
	}
	}
}
Rodrigo_Sasaki

Tente deixar assim

package br.com.caelum.servlet;

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

public class ConnectionFactory {
	public Connection getConnection(){
	System.out.println("Conectando ao Banco de Dados ");
	try{
        Class.forName("com.mysql.jdbc.Driver"); // Adicionei essa linha.
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "");
		
	}
	
	catch (SQLException e){
		throw new RuntimeException(e);
		
		
	}
	}
}
getAdicted
CaioIncau:
Estou usando um Connection Factory
package br.com.caelum.servlet;

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

public class ConnectionFactory {
	public Connection getConnection(){
	System.out.println("Conectando ao Banco de Dados ");
	try{
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "");
		
	}
	
	catch (SQLException e){
		throw new RuntimeException(e);
		
		
	}
	}
}
Olha essa aqui, veja se ajuda:
package caelum;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author House
 */
/* Conexao.java */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Conexao {

    private static final String DATABASE_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DATABASE = "mysql";
    private static final String DATABASE_IP = "localhost";
    private static final short DATABASE_PORT = 3306;
    private static final String DATABASE_NAME = "fj21";
    private static final String DATABASE_URL = "jdbc:" + DATABASE + "://" + DATABASE_IP + ":" + DATABASE_PORT + "/" + DATABASE_NAME;
    private static final String DATABASE_USER = "user";
    private static final String DATABASE_PASS = "senha";

    public static Connection getConnection() throws SQLException, ClassNotFoundException {
        Connection con = null;
        Class.forName(DATABASE_DRIVER);
        con = DriverManager.getConnection(DATABASE_URL, DATABASE_USER, DATABASE_PASS);
        return con;
    }
}

[]'s

C

Class.forName(“com.mysql.jdbc.Driver”);

Ao adicionar esta linha ao meu código está dando erro.

Ai adicionei o throws SQLException, ClassNotFoundException

Como o do Exemplo do Addicted

Pelo que sei a única coisa que fiz foi permitir que o erro continue lá e me avise .

Creio que não era este o problema.

C

O erro agora é o seguinte.

java.lang.Error: Unresolved compilation problems: 
	Unhandled exception type SQLException
	Unhandled exception type ClassNotFoundException

	br.com.caelum.servlet.ContatoDAO.<init>(ContatoDAO.java:19)
	br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:39)
	javax.servlet.http.HttpServlet.service(HttpServlet.java
o código ficou
package br.com.caelum.servlet;

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

public class ConnectionFactory {
	public Connection getConnection() throws SQLException, ClassNotFoundException {
	System.out.println("Conectando ao Banco de Dados ");
	try{
		Class.forName("com.mysql.jdbc.Driver");
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "");
		
	}
	
	catch (SQLException e){
		throw new RuntimeException(e);
		
		
	}
	}
}
Rodrigo_Sasaki

O erro na console diz que você está lançando exceções mas não está tratando, se quiser tratá-las, use um bloco try/catch.

Edit: experimente removê-las do throws

C

Com try e Catch o erro continua o mesmo No suitable driver found for jdbc:mysql://localhost/fj21…
Sem throw não compila.

Rodrigo_Sasaki

CaioIncau:
Com try e Catch o erro continua o mesmo No suitable driver found for jdbc:mysql://localhost/fj21…
Sem throw não compila.

se você colocar no throws, quem chamar seu método terá que tratá-lo, você olhou as classes que chamam seu método?
para evitar isso, sendo que não faria sentido sua ConnectionFactory lançar para quem o chama a exceção, trate a mesma dentro do seu bloco try-catch

se você não tratar a exceção realmente não vai compilar, mas retire do throws e coloque no seu bloco try-catch.

C

type Exception report

message

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

exception

Voltou a dar na mesma com Try e Catch.

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21

br.com.caelum.servlet.ConnectionFactory.getConnection(ConnectionFactory.java:22)

br.com.caelum.servlet.ContatoDAO.(ContatoDAO.java:19)

br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:39)

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

root cause
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21

java.sql.DriverManager.getConnection(DriverManager.java:602)

java.sql.DriverManager.getConnection(DriverManager.java:185)

br.com.caelum.servlet.ConnectionFactory.getConnection(ConnectionFactory.java:17)

br.com.caelum.servlet.ContatoDAO.(ContatoDAO.java:19)

br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:39)

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

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

Mesmo com a linha do Class.forName()?

o jar está na build path do seu projeto?
e qual o nome do seu jar, com versão e tudo mais?

C

O jar esta no buildpath, cliquei em import external archive e selecionei o driver.

Ai então cliquei com o direito e dei add to build path

mysql-connector-java-5.1.18-bin
Este é o nome do Driver

a classe esta assim
package br.com.caelum.servlet;

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

public class ConnectionFactory {
	public Connection getConnection(){
	System.out.println("Conectando ao Banco de Dados ");
	try{
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "");
		
	}
	
	catch (SQLException e){
		throw new RuntimeException(e);
		
		
	}
	}
}
Rodrigo_Sasaki
package br.com.caelum.servlet;

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

public class ConnectionFactory {
	public Connection getConnection(){
	System.out.println("Conectando ao Banco de Dados ");
	try{
		Class.forName("com.mysql.jdbc.Driver");
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "");
    }catch (SQLException e){
		throw new RuntimeException(e);
	}
}

Tente assim

C

Unhadled exception type ClassNotFoundException
Aviso lateral de erro avisando que tem uma exception…
Como já fizemos com throw e try/catch, nem coloquei

Rodrigo_Sasaki

você está desenvolvendo em alguma IDE, por exemplo o eclipse?

ele sublinha com vermelho te pedindo pra tratar mais exceções? a idéia é tratar todas no mesmo bloco try-catch…
diferente de como estava seu código

C

estou usando eclipse sim.

E esta sublinhando em vermelho sim.

Rodrigo_Sasaki

trate a outra exceção dentro do mesmo try-catch

mais ou menos assim:

try{ //codigo }catch(Excecao1 e){ //tratamento }catch(Excecao2 e){ //tratamento }

C
Caramba valeu. era isso mesmo...
package br.com.caelum.servlet;  
  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.SQLException;  
  
public class ConnectionFactory {  
    public Connection getConnection(){  
    System.out.println("Conectando ao Banco de Dados ");  
    try{  
        Class.forName("com.mysql.jdbc.Driver");  
        return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "");  
    }catch (SQLException e){  
        throw new RuntimeException(e);  
    }
    
    catch (ClassNotFoundException e1){  
        throw new RuntimeException(e1);  
    }  
    
    }  
    
}

Vou deixar o código aqui para quem quiser ...

Criado 1 de dezembro de 2011
Ultima resposta 1 de dez. de 2011
Respostas 23
Participantes 3