entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Conexion JSP con MySQL

Buenas compañeros, estoy intentando hacer conexión mediante JSP a MySQL con Tomcat y Apache.

Tengo este código que no se si es el correcto, el driver ya me lo he descargado para ecplise y esta incluido en el path (o eso creo), pero no me termina de conectar y no se cual es el problema. La conexión se que funciona puesto que desde PHP si acceso a la base de datos.

package conexion;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

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

/**
 *
 * @author Jorge Félix
 */
public class ConexionDB {
    public static Connection conex;
    static Statement stm;
    public static ResultSet rs;

    public ConexionDB() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String servidor="jdbc:mysql://localhost/carrito";
        String usuario="root";
        String pass="";
        conex=(Connection)DriverManager.getConnection(servidor, usuario, pass);
        }

    public Connection getConex() {
            return conex;
    }

    public static void setConex(Connection conex) {
            ConexionDB.conex = conex;
    }

    public void desconectar() throws SQLException {
            if (!conex.isClosed()) {
                    conex.close();
            }
    }
}

¿Alguna solución? Gracias :)

4 Respuestas

1voto

Yesod Puntos3530

Bueno, ya lo he conseguido...he seguido este video tutorial y me ha aclarado las ideas:

https://www.youtube.com/watch?v=8G8_JnPmTEg espero sirva para todos aquellos que se atasquen con lo mas básico como me ha pasado a mi :)

Muchas gracias a todos :)

0voto

MitsuGami Puntos8010

Te faltó especificar el puerto que por lo general para MySQL es 3306. Siempre cuando tengas problemas, trata de ser más explícito, dinos si se lanzó una excepción, etc.

0voto

Yesod comentado

Eso lo hago siempre, el tema es que no me salía ningún mensaje de error en el catch

EDITO: No se si funciona aún, estoy intentando acceder a la BD para hacer una consulta con este código

index.jsp:

<%@page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@page import="conexion.ConexionDB"%>
<%@page import="conexion.Consultas"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
<link rel="stylesheet" href="css/estilos.css" >
<script src="js/js.js"></script>
</head>
<body>
    <h1>Long Web</h1>

    <div>
        <form action="Validacion" method="post">
            <p>
                <input type="text" name="user" id="user" >
            </p>
            <p>
                <input type="password" name="pass" id="pass" >
            </p>
            <p>
                <input type="submit" name="Entrar" id="Entrar" >
            </p>
        </form>
        <%
            String nombre = "Hola";
        %>
        <p><%=nombre%></p>
        <%
            ConexionDB.rs = Consultas.Clientes();
            while (ConexionDB.rs.next()) {
                out.println("<tr>");
                out.println("<td>" + ConexionDB.rs.getString("DNI") + "</td>");
                out.println("<td>" + ConexionDB.rs.getString("nombre") + "</td>");
                out.println("<td>" + ConexionDB.rs.getString("apellidos") + "</td>");
                out.println("</tr>");
            }
        %>
    </div>
    <input type="button" value="Saluda" onclick="Saluda()" >
</body>
</html>

Consultas.java

package conexion;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author pepe
 */
public class Consultas {
    public boolean Autenticacion(String user, String pass) throws SQLException {
        ConexionDB.stm = ConexionDB.conex.createStatement();
        ConexionDB.rs = null;
        String Consulta = "Select * from Usuarios where Nombre='"+user+"' and Apellidos='"+pass+"'";
        ConexionDB.rs = ConexionDB.stm.executeQuery(Consulta);
        if (ConexionDB.rs.next()) {
            if (user.equals(ConexionDB.rs.getString("nombre")) && pass.equals(ConexionDB.rs.getString("password"))) {
                return true;
            }
        }
        return false;
    }

    public static ResultSet Clientes() throws SQLException {
        ConexionDB.stm = ConexionDB.conex.createStatement();
        String cadSQL = "";
        cadSQL = "SELECT * FROM USUARIOS";
        ConexionDB.rs = ConexionDB.stm.executeQuery(cadSQL);
        return ConexionDB.rs;
    }

}

Me sale este error:

org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:555)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
causa raíz

java.lang.NullPointerException
conexion.Consultas.Clientes(Consultas.java:24)
org.apache.jsp.index_jsp._jspService(index_jsp.java:149)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Supongo que es porque no se ha establecido conexión...

------------------ConexionDB

public class ConexionDB {
    public static Connection conex;
    public static Statement stm;
    public static ResultSet rs;

    public ConexionDB() throws  SQLException {
        try {
            String servidor = "jdbc:mysql://localhost:3306/blog";
            String usuario = "root";
            String pass = "";
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conex = DriverManager.getConnection(servidor, usuario, pass);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
            JOptionPane.showMessageDialog(null, "Conexion fallida");
        }
    }

    public Connection getConex() {
        return conex;
    }

    public static void setConex(Connection conex) {
        ConexionDB.conex = conex;
    }

    public void desconectar() throws SQLException {
        if (!conex.isClosed()) {
            conex.close();
        }
    }
}

1voto

Javi2EE Puntos6630

Hola Yesod para hacer eso es mejor que utilices PreparedStatement que esta preparada para evitar inyeccion sql, ademas al final de la consulta debes cerrar la conexión,


public class ConexionDB {       

        private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DB_CONNECTION = "jdbc:mysql://localhost:3306/nombre_bbdd";
    private static final String DB_USER = "user";
    private static final String DB_PASSWORD = "pass";
private static Connection getDBConnection() {
        Connection dbConnection = null;
        try {
            Class.forName(DB_DRIVER);
        } catch (ClassNotFoundException e) {
        }
        try {
            dbConnection = DriverManager.getConnection(
                             DB_CONNECTION, DB_USER,DB_PASSWORD);
            return dbConnection;
        } catch (SQLException e) {
        }
        return dbConnection;
    }
}
public class Consultas {

/*esta funcion devuelve null si no se encuentra ningun resultado */
public ResultSet Autenticacion(String user, String pass) throws SQLException {
                Connection dbConnection = null;
        PreparedStatement preparedStatement = null;
                if (username == null) {
            username = "";
        }
        if (password == null) {
            password = "";
        }
        username = username.trim();
                String query ="Select * from Usuarios where Usuario= ? and Password= ?";
                try {
            dbConnection = Connection.getDBConnection();
            preparedStatement =           dbConnection.prepareStatement(query);
            preparedStatement.setString(1, user);
                        preparedStatement.setString(2, pass);
            // execute select SQL stetement
            ResultSet resultSet = preparedStatement.executeQuery();
            return resultSet;
        } catch (SQLException e) {
        } finally {
            if (preparedStatement != null) {
                preparedStatement.close();
            }

            if (dbConnection != null) {
                dbConnection.close();
            }
        }
        return null;
         }
}


Edito en respuesta a tu comentario:

Buenas el codigo que te pase esta probado, lo que pasa que hay bastantes cosas que pueden estar fallando en el codigo, ademas no lo has copiado bien, aparte de eso la excepcion que te lanza es un NullPointer en la linea
47 de la clase Consultas:

conexion.Consultas.Clientes(Consultas.java:47)

te aconsejo que depures un poco mas el error mostrando los datos de las variables por consola para ver que valores va tomando y ademas imprimiendo y controlando las SQL Exception en los bloques catch para controlar si se estan produciendo ya que ahora mismo los bloques catch estan vacios y si se producen excepciones ni te das cuenta.
Aparte de eso has copiado mal esto:

String cadSQL ="Select * from usuarios where DNI='"+username+"' and Password='"+password+"'";

No utilices la concatenación de string para pasarle los parámetros a un preparedStatment, para eso se utiliza la interrogación

String query ="Select * from Usuarios where Usuario= ? and Password= ?";

y con esto los vas añadiendo

preparedStatement.setString(1, username);
        ConexionDB.preparedStatement.setString(2, password);

Ademas no es muy buena practica guardar los resultados en la clase que hace la conexión a la base de datos pero bueno eso es otro tema

0voto

Yesod comentado

He copiado todo pero sigue dando fallo:

index.jsp

<%@page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@page import="conexion.ConexionDB"%>
<%@page import="conexion.Consultas"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
<link rel="stylesheet" href="css/estilos.css" >
<script src="js/js.js"></script>
</head>
<body>
    <h1>Long Web</h1>

    <div>
        <form action="Validacion" method="post">
            <p>
                <input type="text" name="user" id="user" >
            </p>
            <p>
                <input type="password" name="pass" id="pass" >
            </p>
            <p>
                <input type="submit" name="Entrar" id="Entrar" >
            </p>
        </form>
        <%
            String nombre = "Hola";
        %>
        <p><%=nombre%></p>
        <%
                        ConexionDB.rs = Consultas.Clientes();
            while (ConexionDB.rs.next()) {
                            out.println("<tr>");
                            out.println("<td>" + ConexionDB.rs.getString("DNI") + "</td>");
                            out.println("<td>" + ConexionDB.rs.getString("nombre") + "</td>");
                            out.println("<td>" + ConexionDB.rs.getString("apellidos") + "</td>");
                            out.println("</tr>");
            }
        %>
    </div>
    <input type="button" value="Saluda" onclick="Saluda()" >
</body>
</html>

Consultas.java

import java.sql.ResultSet;
import java.sql.SQLException;

public class Consultas {
    /*esta funcion devuelve null si no se encuentra ningun resultado */
    public ResultSet Autenticacion(String username, String password) throws SQLException {
    if (username == null) {
        username = "";
    }
    if (password == null) {
        password = "";
    }
    username = username.trim();
    String cadSQL ="Select * from usuarios where DNI='"+username+"' and Password='"+password+"'";
    try {
        ConexionDB.dbConnection = ConexionDB.getDBConnection();
        ConexionDB.preparedStatement = ConexionDB.dbConnection.prepareStatement(cadSQL);
        ConexionDB.preparedStatement.setString(1, username);
        ConexionDB.preparedStatement.setString(2, password);
        // execute select SQL stetement
        ConexionDB.rs = ConexionDB.preparedStatement.executeQuery();
        return ConexionDB.rs;
    } catch (SQLException e) {
    } finally {
        if (ConexionDB.preparedStatement != null) {
            ConexionDB.preparedStatement.close();
        }
        if (ConexionDB.dbConnection != null) {
            ConexionDB.dbConnection.close();
        }
    }
    return null;
}

    public static ResultSet Clientes() throws SQLException {
        try {
            String cadSQL = "";
            cadSQL = "SELECT * FROM USUARIOS";
            ConexionDB.dbConnection = ConexionDB.getDBConnection();
            ConexionDB.preparedStatement = ConexionDB.dbConnection.prepareStatement(cadSQL);
            ConexionDB.rs = ConexionDB.stm.executeQuery(cadSQL);
            } catch (SQLException e) {
            } finally {
                if (ConexionDB.preparedStatement != null) {
                    ConexionDB.preparedStatement.close();
                }
                if (ConexionDB.dbConnection != null) {
                    ConexionDB.dbConnection.close();
                }
            }
        return ConexionDB.rs;
    }
}

Pero me da este fallo:

Estado HTTP 500 - java.lang.NullPointerException

type Informe de Excepción

mensaje java.lang.NullPointerException

descripción El servidor encontró un error interno que hizo que no pudiera rellenar este requerimiento.

excepción

org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:555)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

causa raíz

java.lang.NullPointerException
conexion.Consultas.Clientes(Consultas.java:47)
org.apache.jsp.index_jsp._jspService(index_jsp.java:149)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

nota La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/8.0.27.

0voto

Javi2EE comentado

Buenas edito la respuesta para ampliarla un poco

0voto

Yesod comentado

Yo estoy por desistir, porque si pongo la conexión y todo en el mismo archivo JSP hace el trabajo sin problemas, pero cuando esta en un .java aparte...no para de dar fallo.

0voto

bl4z3r Puntos16850

Según tu código, dice que la linea 47 del archivo ConsultasDb...

if (ConexionDB.dbConnection != null)

Lanza una excepción de puntero nulo que hace clara referencia a que te falto instanciar un objeto. Por lo que veo, el problema puede ser 1 cosa: En algún momento, del ciclo de vida de la aplicacion, ConexionDB perdió su instancia y cuando quiere llamar a su atributo, lanza la excepción que te da.

0voto

Yesod comentado

Yo estoy por desistir, porque si pongo la conexión y todo en el mismo archivo JSP hace el trabajo sin problemas, pero cuando esta en un .java aparte...no para de dar fallo

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta