Dificuldade com Servlets

10 respostas
joaoabi

Bom gente estou com uma dificuldade de acessar os meus dados(servlet), sei que para a maioria aqui isto é banal mas estou começando, ai ja viram ne, muito sofrimento e pouco resultado.
Vou postar aqui a estrutura do meu código e se alguem puder me ajudar eu agradeço.

Primeiro a classe de conexão;

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

public class FabricaConexa {

		
	
	public void getConnection(){
		
		 try {  
	         
	         Class.forName("com.mysql.jdbc.Driver");   
	         Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Agenda","root","");  
	         System.out.println("Conectado com sucesso");  
	     }   
	     catch (ClassNotFoundException e){  
	         System.out.println("Classe não encontrada");  
	     }  
	  
	     catch (Exception e){  
	         System.out.println("Problemas com o BD"+e);  
	     }  
		 
}
}

Agora vem a servlet que deve gerenciar os dados:

public class GerenciaContato {
	
/*Instancia da classe de conexao*/
	
FabricaConexa objFabricaConexao = new FabricaConexa();
/*Apresentando as variáveis!*/

Connection conn = null;
ResultSet resultset = null;
PreparedStatement smt = null;
/*Criação do método de Inserção!*/
	public void InsereContato(HttpServletRequest req) throws ServletException
	{
		/*Chama o método responsável pela conexao.*/
	   objFabricaConexao.getConnection();
	   
		//Dados resgatados dentro do formulario principal do JSP.
		
		String nome = req.getParameter("txtNome");
		String telefone = req.getParameter("txtTelefone");
		String email = req.getParameter("txtEmail");
		String funcao = req.getParameter("txtFuncao");
		String setor = req.getParameter("txtSetor");
		//Tratamento de dados com o BD;
		
		try {
			PreparedStatement smt =conn.prepareStatement("INSERT INTO contato (nome,telefone,email,funcao,setor) VALUES(?,?,?,?,?");
			
			smt.setString(1, nome);
			smt.setString(2, telefone);
			smt.setString(3, email);
			smt.setString(4,funcao);
			smt.setString(5, setor);
			
			resultset = smt.executeQuery();			
			
		} catch (SQLException ex) {
			
			JOptionPane.showMessageDialog(null,"Ocorreu um erro"+ ex.getMessage());
		}
		finally
		{
			try
			{
				resultset.close();
				smt.close();
				//objFabricaConexao.getConnection().close();
			}
			catch(SQLException ex)
			{
				
			}
		}
		
	}
	public void doPost(ServletRequest request, ServletResponse response)
					throws ServletException, IOException
	{
		PrintWriter out = response.getWriter();
		
		out.println("<html><body>DADOS SALVOS COM SUCESSO</body></html>");
		out.close();
			
	}
}

Bom o problema é que quando eu executo a aplicação da java.lang.NullPointerException.
Eu li aqui no GUJ e vi que esse erro da quando tento referenciar uma variavel nula,ate ai ok,
mas nao consegui achar o erro.

Caso puderem me ajudem plz.

10 Respostas

aix

opa,

1º - posta o stacktrace do erro aqui, fica mais facil de saber onde esta o problema.
2º - quando vc criou a tabela não criou uma primary key? se sim, esqueceu de passar o id.
3º - se é uma servlet porque vc não extendeu a HttpServlet ? extends HttpServlet
4º - confere o webxml depois.

joaoabi

Ok, Aqui está o stacketrace.

java.lang.NullPointerException
	sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:287)
	java.lang.ClassLoader.loadClass(ClassLoader.java:266)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1626)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:461)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	java.lang.Thread.run(Thread.java:636)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.27 logs.

Bem a tabela tem sim, uma chave primaria que é autoincrement.
Vou fazer o extends conforme sua orientação,
O xml ta ok.=)

aix

eae resolveu ?

joaoabi

Pior que não ainda esta dando mesmo erro,
vou continuar a ler o código aqui, deve ser algum detalher que ta passando despercebido.

So nao entendi o seguinte, mesmo o id da minha tabela sendo autoincrement eu tenho que
passa ele no insert?

Valews

aix

joaoabi:
Pior que não ainda esta dando mesmo erro,
vou continuar a ler o código aqui, deve ser algum detalher que ta passando despercebido.

So nao entendi o seguinte, mesmo o id da minha tabela sendo autoincrement eu tenho que
passa ele no insert?

Valews

se esta autoincrement não precisa, coloca um breakpoint bem no incio e debuga.

fabiomedeirosf

Segestões:

1. Mude seu método de getConnection colocando um retorno:

public Connection getConnection(){  
          
         try {    
               
             Class.forName("com.mysql.jdbc.Driver");     
             Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Agenda","root","");    
             System.out.println("Conectado com sucesso");    
             return con;
         }     
         catch (ClassNotFoundException e){    
             System.out.println("Classe não encontrada");    
         }    
        
         catch (Exception e){    
             System.out.println("Problemas com o BD"+e);    
         }    
return null;
           
}
2. No seu servlet:
Connection conn = null;  
ResultSet resultset = null;  
PreparedStatement smt = null;  
/*Criação do método de Inserção!*/  
    public void InsereContato(HttpServletRequest req) throws ServletException  
    {  
        /*Chama o método responsável pela conexao.*/  
       conn = objFabricaConexao.getConnection();

O erro é, vc estava usando "conn" onde ele foi atribuído null. No seu objeto de criar conexão, ele apenas abria uma conexão, mas não atribuía a mesma a "conn".

joaoabi

fabio~

Era isso mesmo , muito obrigado a todos.

fabiomedeirosf

Interessante você dar uma olhada em padrões de projeto, de início, acho que o pattern DAO vai ser legal para sua app.

joaoabi

obrigado pela dica, vou procurar sobre isso,
Estou estudando pelo Livro. Desenvolvimento para Web com Java do Everton Coimbra de Araújo da
editora Visual books, mas to tendo dificuldade com ele ai vivo procurando material na web.

Vou ver sobre padroes de projeto conforme você me orientou. Valeu!!!

Rocklee6544

Como já responderam sua questão estava faltando getConnection();

E como disseram um dos padrões de projetos usados para este caso é o Factory.

A idéia é encapsular a criação de objetos trabalhosos.

A vários padrões e um deles diz que se vc precisa vc pede.

Um DAO tem apenas uma especialidade, no caso permitir acesso aos dados do banco.
(Ele não tem e nem deve ter a responsabilidade de criar conexões).

Portanto se vc precisa de conexão vc deve pedir, mas pra frente vc deve fazer um exercício que lhe diz isso.
(Vc pedir aquilo que vc precisa é padrão chamado injeção de dependência).

Outro padrão também é o Isolator que básicamente diz copio e colou isolou.

(A idéia é que se vc tem métodos que utilizam várias linhas incomuns vc encapsula isso
em um metódo).

Quando vc lida com classes vc trabalha sempre com especialistas e em java e orientação a objetos
é sempre legal trabalhar dessa forma.

Criado 22 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 10
Participantes 4