[RESOLVIDO] Alguém ja fez o exemplo de servlet da FJ21 da Caelum?

12 respostas
D

Alguém já fez o exemplo de servlet da FJ21 da apostila da Caelum? Fiz o servlet de cadastro de usuario e me retorna o seguinte erro quando mando gravar:

[i]HTTP Status 500 -

type: Exception report

message

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

exception

java.lang.RuntimeException

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

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

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

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

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.
Apache Tomcat/6.0.20
[/i]

Alguém tem ideia, alguma vaga ideia do que pode estar acontecendo? Já tentei de tudo.

12 Respostas

Paulo_Silveira

O que aparece no log do tomcat? Voce esta usando Java 6? Colocou o driver do mysql no seu path?

S

Eu fiz e rodou perfeitamente.

D

Onde consigo ver o log do tomcat? a pasta C:\Arquivos de programas\Apache Software Foundation\Apache Tomcat 6.0.20\logs está vazia… estou usando Java 6, o driver do mysql está ok

D

imagino que sim, mas nao foi minha intencao suspeitar que o exemplo estivesse com problemas. Com certeza foi algo q fiz errado, porém, já percorri toda a aplicação e não vejo nada de errado… apenas gostaria de uma pista pra saber o q pode estar acontecendo. Será algum problema no web.xml ?

Vmaia

ddso:
Alguém já fez o exemplo de servlet da FJ21 da apostila da Caelum? Fiz o servlet de cadastro de usuario e me retorna o seguinte erro quando mando gravar:

[i]HTTP Status 500 -

type: Exception report

message

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

exception

java.lang.RuntimeException

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

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

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

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

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.
Apache Tomcat/6.0.20
[/i]

Alguém tem ideia, alguma vaga ideia do que pode estar acontecendo? Já tentei de tudo.

Ola, vc está usando eclipse wtp junto ao tomcat ?
O drivermanager do BD está junto ao projeto ?

teste tirar as classes de acesso ao banco , e tente rodar o projeto. =D

D

Vmaia:
Ola, vc está usando eclipse wtp junto ao tomcat ?
O drivermanager do BD está junto ao projeto ?

teste tirar as classes de acesso ao banco , e tente rodar o projeto. =D


Estou usando NetBeans. O Drivermanager está numa classe do projeto, sim. A formulário com os campos pra preencher aparece, mas na hora de mandar gravar, surge o erro.

Vmaia

Faz o seguinte posta o código que realiza o connect, acho que é a classe ConnectionFactory.java, vamos car uma olhada no teu código. =D

D
Vmaia:
Faz o seguinte posta o código que realiza o connect, acho que é a classe ConnectionFactory.java, vamos car uma olhada no teu código. =D
public class ConnectionFactory {

    public Connection getConnection(){
        try{
            return DriverManager.getConnection("jdbc:mysql://192.168.1.1/teste", "user", "senha");
        } catch (SQLException e){
            throw new RuntimeException();
        }
    }
}
public class AdicionaContatoServlet extends HttpServlet {

    @Override
    protected void service (HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        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 = null;

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

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

        out.println("<html>");
        out.println("<body>");
        out.println("Contato " + contato.getNome() + " adicionado com sucesso!");
        out.println("<body>");
        out.println("<html>");
        
    }
}
Vmaia
public class ConnectionFactory {

    public Connection getConnection(){
        try{
             // Este é um dos meios para registrar um driver   
             Class.forName("com.mysql.jdbc.Driver").getInstance();  

            return DriverManager.getConnection("jdbc:mysql://192.168.1.1/teste", "user", "senha");
        } catch (SQLException e){
            throw new RuntimeException();
        }
    }
}

Eu não sei como funciona tua aplicação, mas tente arranjar uma maneira de não ter que ficar criando um connect a cada getConnection().

Faz o teste com o Class.forName("com.mysql.jdbc.Driver").getInstance(); e manda um feedback =D

obs.: eu não me lembro se é necessário o ".getInstance();", se der certo ..ok .... caso contrario tenta sem ele. :D

D

Fiz a alteração conforme você sugeriu, com uma pequena mudança, ficou assim:public class ConnectionFactory { public Connection getConnection(){ try{ Class.forName("com.mysql.jdbc.Driver"); // acrescentei essa linha return DriverManager.getConnection("jdbc:mysql://192.168.1.1/teste", "user", "senha"); } catch (SQLException e){ throw new RuntimeException(e); } catch(Throwable t){ // e acrescentei esse catch t.printStackTrace(); } return null; } }Funcionou perfeitamente!
O método .getInstance() não existe, que estranho, não?
Afinal de contas, o que esse comando faz??? O driver MySQL já não é especificado na linha 5?

Vmaia

Eheheheh sabia que o getInstance(); tava de sacanagem …ashuahsuha

o Class.forName(“com.mysql.jdbc.Driver”); registra o driver (acho que na JVM).
e p DriverManager.getConnection(“jdbc:mysql://192.168.1.1/teste”, “user”, “senha”); faz uma requisição a ele e estabelece a conexão.

Se não me engano nos recentes jar’s há instruções que registram os driver (entre outras coisas) automaticamente quando a aplicação é submetida a JVM. (algo parecido, pessoal daqui poderia dar uma explicação melhor :D).

B

Desculpem-me pelo up, mas estou com o mesmo problema do amigo aí em cima e a solução proposta não me ajudou…
qunado executo a linha

Class.forName("com.mysql.jdbc.Driver");

ela lança um ClassNotFoundException: com.mysql.jdbc.Driver

Acho que não estou importando o Driver do mysql corretamente
Já tentei alterei o CLASSPATH (consigo acessar o banco normalmente através da jvm com programas que fiz pra testar) mas não funcionou
já tentei ir no projeto Proprieties/Java Build Path/Libraries e importei o driver e tbm não funcionou
e já tentei importar o driver para a pasta WEB-INF/lib e mais uma vez não funcionou

alguém sabe o que pode estar errado?

Criado 18 de maio de 2010
Ultima resposta 21 de dez. de 2010
Respostas 12
Participantes 5