Java EE、JDBC 和 Tomcat

Posted

技术标签:

【中文标题】Java EE、JDBC 和 Tomcat【英文标题】:Java EE, JDBC and Tomcat 【发布时间】:2013-12-23 15:23:29 【问题描述】:

我正在尝试使用 JSP 从数据库中获取数据,但是在服务器上运行它时出现以下错误。谁能告诉我出了什么问题并告诉我如何解决它?

type Rapport d''exception

message java.lang.NullPointerException

description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.

exception

org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
cause mère

java.lang.NullPointerException
    org.apache.jsp.vrf_jsp._jspService(vrf_jsp.java:84)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de Apache Tomcat/7.0.47.

这是我的代码:

package utilitaire;

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

public class Database 


    public Connection con;

    public Connection createConnection()
    
        try
        
            Class.forName("com.mysql.jdbc.driver");
            this.con = DriverManager.getConnection("jdbc:mysql://localhost:3306/scoop_phase2p2","root","");
        catch(ClassNotFoundException e)
            System.out.println("driver introuvable");
        catch(SQLException e)
            e.getErrorCode();
        
        return this.con;
    




/************ *************** **********/

<%@ page language = "java" %>
<%@ page import = "utilitaire.Admin" %>
<%@ page import = "utilitaire.Database" %>
<%@ page import = "java.sql.SQLException" %>
<%@ page import = "java.sql.ResultSet" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.Connection" %>

<%
    String login = request.getParameter("login");
    String mdp = request.getParameter("mdp");

    Database db = new Database();
    Connection conn = db.createConnection();
    try
    
        PreparedStatement query = conn.prepareStatement("SELECT * FROM admin  WHERE login= ? AND DECODE(mdp, 'key')=?");
        query.setString(1, login);
        query.setString(2, mdp);
        ResultSet rs = query.executeQuery(); 
        for(int i=0; rs.next(); i++)
        if(i!=0)
            out.print("yup");
        else
            out.print("nope");
    catch(SQLException e)
        e.getCause();
    

%>

【问题讨论】:

NullPointerException 当您尝试使用未赋值对象的方法时发生。当我遇到这个问题时,我会在每个对象的用法中插入一些 if(!= null)else 以查看问题的根源。在第一个视图中,您没有在 JSP 中创建连接,因为 conn 为空 【参考方案1】:

首先:

Class.forName("com.mysql.jdbc.driver");

这里的司机应该是司机。 Java 类名区分大小写。因此,您的代码会抛出 ClassNotFoundException:

 catch(ClassNotFoundException e)
        System.out.println("driver introuvable");
    catch(SQLException e)
        e.getErrorCode();
    
    return this.con;

这里有几个问题。首先,无论发生什么,你都会返回“con”。即使它仍然为空。 SQLException 处理程序实际上什么都不做。至少您应该记录堆栈跟踪。

   Database db = new Database();
Connection conn = db.createConnection();
try

    PreparedStatement query = conn.prepareStatement("SELECT * FROM admin  WHERE login= ? AND DECODE(mdp, 'key')=?");

这里可能会发生什么:conn 保持为空,而您没有检查它。然后您尝试在空引用上调用 prepareStatement 并获取 NullPointerException。

修复“驱动程序 -> 驱动程序”问题,而不是返回 null 并吞下异常,而是重新抛出它,这样您就有机会查看问题所在:

   try
    
        Class.forName("com.mysql.jdbc.Driver");
        this.con = DriverManager.getConnection("jdbc:mysql://localhost:3306/scoop_phase2p2","root","");
        return this.con;
    catch(ClassNotFoundException e)
        throw new IllegalStateException(e);
    catch(SQLException e)
        throw new IllegalStateException(e);
    

【讨论】:

我已将驱动程序更改为驱动程序,但仍然出现空指针错误,就像我的程序找不到我提供的 mysql 连接器,我正在使用 mysql-connector-java5。 1.18.bin.jar。我已经像这样包含它:右键单击我的项目--构建路径--配置构建路径--库--添加外部jar。我做错了吗??

以上是关于Java EE、JDBC 和 Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

MySQLSyntaxErrorException:未知数据库 - JDBC - Java EE

Java EE 声明性安全性,无法为 JDBC 领域用户加载组

J2EE的十三种技术(规范)

在 Eclipse java EE 中设置 JDBC 驱动程序

JAVA EE的十三种技术

Java EE项目 [SQLServer 2000 Driver for JDBC]Error establishing socket.