• Viernes 29 de Marzo de 2024, 11:47

Autor Tema:  Jdbc-servlet  (Leído 4398 veces)

guanuma

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Jdbc-servlet
« en: Jueves 27 de Mayo de 2004, 13:26 »
0
: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

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Jdbc-servlet
« Respuesta #1 en: Jueves 27 de Mayo de 2004, 15:16 »
0
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

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Jdbc-servlet
« Respuesta #2 en: Jueves 27 de Mayo de 2004, 16:20 »
0
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

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Jdbc-servlet
« Respuesta #3 en: Jueves 27 de Mayo de 2004, 16:48 »
0
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

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Jdbc-servlet
« Respuesta #4 en: Jueves 27 de Mayo de 2004, 23:34 »
0
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:

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Jdbc-servlet
« Respuesta #5 en: Viernes 28 de Mayo de 2004, 15:21 »
0
El NULLPointerException lo devuelve porque no habras instanciado algo pero si compila pero no anda. No entiendo q puede llegar a ser, pero si te puedo pasar un codigo, la respuesta es si, te doy un servlet q tira una consulta, ahi va:

package mcpatos;

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

/**
 * <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 ServletLogueo extends ServletBase {

  /** Procesa la petición del método post.
   *  @param  request
   *  @param  response
   *  @throws ServletException
   *  @throws IOException*/
  public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
  {
    if ((request.getParameter("AccionServidor")).equals("AccionIngresoUsuarios"))
      doLogin(request, response);
    if ((request.getParameter("AccionServidor")).equals("AccionCerrarSesion"))
      doCloseSession(request, response);
  }

  /** Metodo que despacha a distintas paginas de acuerdo a si el usuario
   *  se encuentra registrado o no
   *  @param  request
   *  @param  response
   *  @throws ServletException
   *  @throws IOException*/
  private void doLogin(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
  {
    response.setContentType(CONTENT_TYPE);
    session = request.getSession(true);
    session.setMaxInactiveInterval(300); //Seteamos 5 minutos de sesión por default

    String Username = request.getParameter("username");
    String Password = request.getParameter("password");

    //Verifico el nombre de usuario y contraseña
    //donde username y password son los nombres de los edit text de la
    //pagina HTML de inicio
    if (isRegistered(Username, Password))
    {
      GoToPage("/SitioMc/Consultas/Usuario.jsp", request, response);
    }
    else
      GoToPage("/SitioMc/Errores/UsuarioNoRegistrado.html", request, response);
  }

  /** Metodo que verifica si el usuario ingresado esta registrado
   *  @param username
   *  @param password
   *  @returns true o false */
  private static boolean isRegistered(String username, String password)
  {
    if ((username == null) || (password == null))
      return false;

    boolean success = false;
    java.sql.Statement ibLogin = null;
    java.sql.ResultSet dsLogin = null;

    // Ejecuto la consulta en caso de ser posible
    try
    {
      ibLogin = McPatosDataBase.getConnection().createStatement();
      dsLogin = ibLogin.executeQuery("select Nombre, Clave, CodigoCliente, Administrador from usuarios where nombre = '" + username + "' and clave = '" + password + "'");
    }
    // Atrapo la excepcion correspondiente a la consulta
    catch (java.sql.SQLException e)
    {
      System.out.println ("Error al tirar el select a Usuarios.");
      showSQLException (e);
    }
    // Analizo los resultados de la consulta y los comparo contra los
    // recibidos por parámetro
    try
    {
      while (dsLogin.next())
      {
        if ( (username.equals(dsLogin.getString("Nombre")))
        &&   (password.equals(dsLogin.getString("Clave"))) )
        {
          session.setAttribute("Nombre",username);
          String customerCode = dsLogin.getString("CodigoCliente");
          session.setAttribute("Codigo",customerCode);
          session.setAttribute("Administrador",dsLogin.getString("Administrador"));

          if (dsLogin.getInt("CodigoCliente") > 0)
          {
            try
            {
              dsLogin = ibLogin.executeQuery("select Nombre from Clientes where codigo = '" + customerCode + "'");
              dsLogin.next();
              session.setAttribute("Nombre", dsLogin.getString("Nombre"));
              success = true;
            }
            catch (java.sql.SQLException e)
            {
              System.out.println ("Error al tirar el select a Clientes.");
              showSQLException (e);
            }
          }
          else
          {
            session.setAttribute("Nombre", username + " - Personal del local");
            success = false;
          }
        }
      }

      try { if (dsLogin!=null) dsLogin.close (); } catch (java.sql.SQLException e) { showSQLException (e); }
      try { if (ibLogin!=null) ibLogin.close (); } catch (java.sql.SQLException e) { showSQLException (e); }

    }
    // Atrapo la excepcion correspondiente a la navegacion de los resultados
    catch (java.sql.SQLException e)
    {
      System.out.println ("Incapaz de navegar por los resultados de la consulta dsLogin");
      showSQLException (e);
    }
    // En caso de no existir el registro en la base de datos, el metodo
    // devuelve false
    return success;
  }

  /** Metodo que cierra la sesion y despacha al inicio del Sitio
   *  @param  request
   *  @param  response
   *  @throws ServletException
   *  @throws IOException*/
  private void doCloseSession(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
  {
    response.setContentType(CONTENT_TYPE);
    session.setAttribute("Carrito", null);
    session = null;
    GoToPage("/SitioMc/index.html", request, response);
  }

}

guanuma

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Jdbc-servlet
« Respuesta #6 en: Domingo 30 de Mayo de 2004, 03:14 »
0
:hola:

gracias por el codigo.

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Jdbc-servlet
« Respuesta #7 en: Domingo 30 de Mayo de 2004, 23:47 »
0
De nada!!!!!!!!!

Pero............te sirvio o no????

Salu2!!!!!!!