Programación General > JSP/Servlets

 Jdbc-servlet

(1/2) > >>

guanuma:
:hola:
quiero ver si alguien me puede ayudar con lo siguiente:

estoy tratando de realizar un pequeño ejemplo de un servlet que devuelva una consulta sql, pero siempre me da el siguiente error usando el TOMCAT 5.0.19

java.lang.NullPointerException
   at ConsultaServlet.doPost(ConsultaServlet.java:45)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

aqui esta el codigo para ver si alguien me dice donde esta el error porque de verdad que e tratado de modificarlo de varias forma y siempre me da el mismo error:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;


public class ConsultaServlet extends HttpServlet{
   Connection con;
   
   public void init(ServletConfig cf) throws ServletException
   {
      super.init(cf);
      try
       {
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           
       }
       catch(ClassNotFoundException e)
       {
          System.err.print("error de para conectarse al driver" + e.getMessage());
       }
       try
       {
           con = DriverManager.getConnection("jdbc:odbc:MS Access DataBase");
          
       }
       catch(SQLException e)
       {
        System.err.print("error de sentencia sql 1" + e.getMessage());
       }
       
   }
   
   
   
      
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
      {   
   
          try
          {
   Statement stmt = con.createStatement();
   
   ResultSet rs = stmt.executeQuery("SELECT * FROM empleados");
   rs.next();                  
   PrintWriter out = response.getWriter();

   out.println("<html>");
   out.println("<body>");
   out.println("<table align=center border=1 cellPadding=1 cellSpacing=1 width=\"75%\">");
 
   out.println("<tr>");
   out.println("<td>" + rs.getString("id") + "</td>");
   out.println("<td>" + rs.getString("nombre") + "</td>");
   out.println("</tr>");
   out.println("</table>");
   out.println("</body>");
   out.println("</html>");
   out.close();
}
catch(SQLException e)
{
}

}

}
   
muchisimas gracias de antemano.

nicokiki:
Hola!!!!!!

Lo q haces mal creo es cuando llamas al getConnection() porque le pasas un solo parametro y lo otro es q no cargas los drivers de la base de datos.
Mira este .java q mando q se conecta a una base de datos de Interbase. Es una clase q maneja eso con un constructor privado. Creo q esta buena, ahi va:

package mcpatos;

/**
 * <p>Title: Mc Pato's</p>
 * <p>Description: Delivery de Comidas Rapidas</p>
 * <p>Copyright: Copyright © 2004</p>
 * <p>Company: Gonzalez & Tavasci</p>
 * @author Gonzalez Nicólas, Tavasci Dozo Pablo
 * @version 1.0
 */

public class cDataBase
{
  /** Driver de la base de datos */
  private static java.sql.Driver     Driver     = null;
  /** Conexion a la base de datos */
  private static java.sql.Connection Connection = null;
  /** Instancia de la clase cDataBase */
  private static cDataBase Instance = null;

  /** Constructor privado. Llama al metodo Connect()*/
  private cDataBase()
  {
    this.Connect();
  }

  /** Metodo static q llama al constructor privado
   *  @returns Instancia unica de la clase */
  public static cDataBase getInstance()
  {
    if (Instance == null)
      Instance = new cDataBase();
    return Instance;
  }

  /**
   * @returns Conexion a la base de datos*/
  public java.sql.Connection getConnection()
  {
    return this.Connection;
  }

  /** Metodo que se conecta a la base de datos de la aplicacion */
  private void Connect()
  {
    String databaseURL = "jdbc:interbase://localhost/C:/Resin/doc/BaseGDB/base.gdb";
    String user = "SYSDBA";
    String password = "masterkey";
    String driverName = "interbase.interclient.Driver";

    try
    {
      // Carga del driver en memoria.
      try
      {
        Class.forName(driverName);
      }
      catch (java.lang.ClassNotFoundException e)
      {
        System.out.println ("InterClient no se encuentra definido en el class path.");
        System.out.println (e.getMessage ());
        return;
      }

      // A esta altura el driver debería estar registrado con el driver manager.
      try
      {
        Driver = java.sql.DriverManager.getDriver (databaseURL);
        System.out.println ("InterClient version " +
                            Driver.getMajorVersion () +
                            "." +
                            Driver.getMinorVersion () +
                            " registrada con el driver manager.");
      }
      catch (java.sql.SQLException e)
      {
        System.out.println ("No se ha podido encontrar InterClient entre los drivers registrados.");
        return;
      }

      // Interclient esta ahora registrado con el driver manager
      // Ahora se intentara conseguir una conexion con la base de datos
      try
      {
        Connection = java.sql.DriverManager.getConnection (databaseURL, user, password);
        System.out.println ("Conexion establecida.");
      }
      catch (java.sql.SQLException e)
      {
        System.out.println ("Error al establecer la conexion.");
        return;
      }

      // Deshabilitacion del autocommit
      try
      {
        Connection.setAutoCommit (false);
        System.out.println ("Auto-commit deshabilitado.");
      }
      catch (java.sql.SQLException e)
      {
        System.out.println ("Error al deshabilitar el auto-commit.");
        return;
      }
    }
    finally
    {
    }
  }

  /** Cierra la conexion a la base de datos*/
  public void Close()
  {
    try
    {
      if (Connection != null)
        Connection.close();
    }
    catch(java.sql.SQLException e)
    {
      System.out.println("No se pudo cerrar la conexion a la base de datos");
    }
  }
}


Salu2!!!! y responde si te sirvio o no!!!!!

guanuma:
gracias por el ejemplo nicokiki, pero el problema que tengo en el codigo que postie,reside mas en el servlet que la base de dato, los driver si lo habia cargado, y al getConnection le pase un solo parametro por la base de dato no requiere de user name  ni de password, el problema real es  ese NullException que lo mas logico es que sea por no haber referenciado el puntero al primer registro de la tabla de resultado, pero e intentado varias modificaciones y ya se me agotaron  las ideas.

nicokiki:
Hola!!!!!

Proba poniendo a con como miembro static del servlet ConsultaServlet asi:

public class ConsultaServlet extends HttpServlet{
  private static Connection con = null; //Puede ser protected en caso q heredes de este  
                                              //servlet y necesites la conexion en los hijos
Un metodo static es un metodo q no "ve" a this, o sea, se lo puede llamar sin instancias de la clase y un atributo static es un atributo q se mantiene durante la vida de la clase.

Luego en el init() instancias "con" usando getConnection() y acordate q eso te va a andar.

En el destroy del servlet, hace un close de la conexion a la base. Fijate en el close de la clase q te mande como se hace!!

Salu2!!!!!

Responde si anduvo o no

guanuma:
hola.

hice lo que me recomendaste y nada,  me sigue dando el mismo NullPointerException, agradeceria mucho si tuvieras algun codigo de un servlet que haga una consulta sql a una base de datos para compararlo a ver si termino de encontrar el error. Gracias  por la ayuda.  :hola:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa