Como relacionar o DAO ao JSP

6 respostas
A

Galera,

Estou estudando o relacionamento entre JSP, Fabrica de Conexão e DAO, utilizando o MySQL. Entretanto, estou com problema ao inserir dados no MySQL. Já pesquisei na Internet e também na apostila da Caelum, só que não obtive o êxito esperado. O erro que aparece é:

type Exception report

message

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

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /inserir.jsp at line 16

13:
14: try{
15: PaisDao dao = new PaisDao();
16: dao.insere(p);
17: }
18: catch (SQLException e) {
19: throw new SQLException(e);

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

root cause

java.lang.NullPointerException
br.ccp.dao.PaisDao.insere(PaisDao.java:31)
org.apache.jsp.inserir_jsp._jspService(inserir_jsp.java:73)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

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

Aqui vai as minhas classes e o arquivo JSP. Obrigada!

Inserir.JSP

<%@page import = "br.ccp.modelo.*" %>
<%@page import = "br.ccp.dao.*" %>
<%@page import = "br.ccp.fabrica.*" %>
<%@page import="java.sql.*" %> 
<%@ page import="java.util.*" %> 

<%
	
	
	Pais p = new Pais ();
	p.setPais(request.getParameter("pais"));
	p.setCapital(request.getParameter("capital"));
	
	try{
	PaisDao dao = new PaisDao();
		dao.insere(p);
	} 
	catch (SQLException e) {
		throw new SQLException(e);
	}
	
	out.println("Dados enviados com sucesso!!!");
	
%>

PaisDao.java

package br.ccp.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;


import br.ccp.fabrica.FabricaDeConexao;
import br.ccp.modelo.Pais;



public class PaisDao {
	
	public PaisDao(){
	
	}
	
	private Connection conection;
	
	
	public void getConexao()throws SQLException {
		conection = FabricaDeConexao.getConnection();
	}
		

		
	

	public void insere(Pais pais)throws SQLException {
		PreparedStatement stmt = this.conection.prepareStatement (" insert into pais (pais, capital, idioma, populacao, moeda) values (?,?,?,?,?)");
		stmt.setString(1,pais.getPais());
		stmt.setString(2,pais.getCapital());
		stmt.execute();
		conection.commit();
		stmt.close();
		
			
	}
}

FabricaDeConexao.java

package br.ccp.fabrica;

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

public class FabricaDeConexao {
	
	public FabricaDeConexao(){
		
		
	}
	
	public static Connection getConnection()throws SQLException {
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost:3306/pais", "root", "XXX");
			}
		catch(ClassNotFoundException ex){
			throw new SQLException (ex.getMessage());
		}
		catch(Exception e){
			throw new SQLException (e.getMessage());
		}
		
	}
	

}

6 Respostas

T

Para entender td isso, primeira coisa: NÃO faça assim… estude MVC antes… rs

D

Na linha 19 do seu JSP, troque

throw new SQLException(e);

Por

e.printStackTrace();

E veja no console a mensagem de erro.

M

Verifique se os campos do comando insert são todos obrigatórios no seu metodo insert da classe DAO

L

Boa tarde, Andreia.

Vamos passo a passo:

Na linha 31 do PaisDao esta ocorrendo uma exceção de NullPointerException:

java.lang.NullPointerException
br.ccp.dao.PaisDao.insere(PaisDao.java:31)

Essa exceção ocorre quando você tenta utilizar um objeto nulo.

Nessa linha você tenta acessar o objeto this.connection:

PreparedStatement stmt = this.conection.prepareStatement (" insert into pais (pais, capital, idioma, populacao, moeda) values (?,?,?,?,?)");

Aparentemente você criou um método getConexão para definir (settar - note que aqui já houve um erro na nomenclatura do método) o valor dessa variavel, porem em nenhum momento você o chamou, ou seja, a variavel ainda deve estar com valor nullo, isso possivelmente estaria causando um NullPointerException. Lembrando que a melhor forma de encontrar um erro é debugando através de uma IDE.

Eu a aconselharia a retonar um objeto do tipo Connection no método getConexao e passar a utiliza-lo no lugar de this.connection. Ex:

public Connection getConexao()throws SQLException {
     if(connection == null){
         connection = FabricaDeConexao.getConnection(); 
     }
     return connection;
 }

Lembrando que essa é apenas uma solução “alternativa” para que o seu código funcione, como o Tecnoage disse, para entender tudo isso a melhor coisa é estudar MVC.

Espero que funcione.

A

Meninos,

Consegui resolver este problema e agradeço a todos que me ajudaram. Eu fiz o que vocês me pediram (como estudar um pouco mais de MVC) e novamente utilizei a apostila da caelum para sanar o meu problema. O erro se dava na classe PaisDao, onde subtrai este trecho:

public void getConexao()throws SQLException {   
        conection = FabricaDeConexao.getConnection();   
    }

E acrescentei a seguinte linha neste trecho:

public void insere(Pais pais)throws SQLException {
		Connection con = FabricaDeConexao.getConnection(); //linha acrescentada
		PreparedStatement stmt = con.prepareStatement(" insert into pais (pais, capital) values (?,?)");
			
		stmt.setString(1,pais.getPais());
		stmt.setString(2,pais.getCapital());
		stmt.execute();
		stmt.close();
		con.close();
		
			
	}

Já o JSP ficou com a seguinte estrutura:

<%@page import = "br.ccp.modelo.*" %>
<%@page import = "br.ccp.dao.*" %>
<%@page import = "br.ccp.fabrica.*" %>
<%@page import="java.sql.*" %> 

<%
	
	Pais p = new Pais ();
	p.setPais(request.getParameter("pais"));
	p.setCapital(request.getParameter("capital"));
	PaisDao dao = new PaisDao();
	dao.insere(p);
	out.println("Dados enviados com sucesso!!!");
	
%>
A

O legal também seria utilizar a instrução abaixo:

<jsp:useBean id=“dao” scope=“page” class=“br.ccp.dao.NomeSuaClasse”/>

assim vc não precisa criar uma instância dela…
De qualquer a solução já foi encontrada e o problema era outro.

Abraços

Criado 28 de abril de 2008
Ultima resposta 1 de mai. de 2008
Respostas 6
Participantes 6