servlet 的数据库连接问题 - Java webapp [重复]

Posted

技术标签:

【中文标题】servlet 的数据库连接问题 - Java webapp [重复]【英文标题】:Database connection issue with servlets - Java webapp [duplicate] 【发布时间】:2018-03-19 19:54:39 【问题描述】:

我正在尝试开发一个连接到数据库的 Web 应用程序。我正在尝试连接到数据库,但它一直给我一个空指针异常。我几乎尝试了所有方法,但似乎找不到错误。如果有人可以帮助我,那就太好了!

请注意,我可以使用下面写的详细信息通过 mysql 工作台连接到数据库。 JDBC 连接器被添加到构建路径中,servlet 也是如此。

html

<form action="./servlets/Login" method="GET">
                    <div>
                        <label for="name">Username:</label>
                        <input type="text" name="name"/><br/>
                        <label for="pass">Password:</label>
                        <input type ="password" name="pass"/><br/><br/>
                        <label for="submit"></label>
                        <input type="submit" class="btn btn-primary btn-xl page-scroll" name="submit" value="Login">
                    </div>
                    </form>

连接到 MySQL 服务器的 Java

公共类验证用户

private static Connection connect = null;
  private static String host="127.0.0.1:3307";
  private static String database="activities";
  private static String username="root";
  private static String password="Hitesh123";
  //connecting to the database
  public static Connection getConnection()
        if(connect ==null)
            try
             Class.forName("com.mysql.jdbc.Driver");
              String conn_string="jdbc:mysql://"+host+"/"+database;
              Connection connect = DriverManager.getConnection(conn_string,username,password);
              return connect;
            catch(Exception ex)
                 System.out.println("Cannot connect to databse"); 
                return null;    
                //ex.printStackTrace();
            
        else
            return connect;
        
    
  public Admin checkAdmin(String user,String password)
      String sql="SELECT * from Admin WHERE Username=? AND PasswordHash=?";  
      Admin a=null;
        try( Connection connect = getConnection(); 
             PreparedStatement pstmt = connect.prepareStatement(sql);
            )  
             pstmt.setString(1,user);
             pstmt.setString(2,MD5HashGenerator.getMD5Hash(password));
             try (ResultSet rs = pstmt.executeQuery();)
               while(rs.next())
                  //int id=rs.getInt("AdminID");
                   int id=1;
                  String uname=rs.getString("Username");        
                  String pass=rs.getString("PasswordHash");     
                  a=new Admin(id,uname,pass);
                  break;

              
             
        catch(SQLException ex)
            System.out.println("does not work");
            ex.printStackTrace();   
        
        return a;

    

错误信息

Cannot connect to databseMar 19, 2018 7:43:29 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Login] in context with path [/activities_connect] threw exception
java.lang.NullPointerException
    at main.bean.VerifyUser.checkAdmin(VerifyUser.java:80)
    at main.Login.doGet(Login.java:36)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

编辑:再次检查构建路径,没有变化...向部署程序集添加了 jar,但仍然没有变化..

【问题讨论】:

在您的 VerifyUser.java 文件中识别行# 80 第 80 行是 PreparedStatement pstmt = connect.prepareStatement(sql);在 checkAdmin 类中 当你的代码到达这部分时connectnull。在调试器下运行它,你应该会看到它。 您的代码中有return null;。你希望它做什么? 如果没有连接就返回null.... 【参考方案1】:

你尝试获取连接的方式显示了典型的菜鸟错误,尤其是在Java中,我们已经检查了异常。核心或库异常通常会揭示引发它的原因。与其打印一些通用且不明确的消息并返回 null(我猜这会导致 NullPointerException),不如记录实际的异常消息并关注可能出现的问题。

【讨论】:

我已经记录并包含在我的问题中。我无法通过尝试多种方法来解决这个问题,因此我来到这个论坛。不用指出这是菜鸟的错误…… @HiteshMankani 您已将NPE 登录包含在问题中,但我们已经知道这是由于您从getConnection() 返回null 造成的。如果需要帮助,请将 ex.printStackTrace() 放回 getConnection() @Kayaman,我得到的错误是“java.lang.ClassNotFoundException: com.mysql.jdbc.Driver”,但 jar 文件在构建路径中...... @HiteshMankani 但它不在类路径中。您在运行时需要驱动程序,仅在构建期间获得它是不够的(实际上您在构建期间根本不需要它)。 我不想贬低你的编程技巧来说明问题。相反,我的意思是快速编写代码以获得最快的结果往往会跳过真正重要的事情,这可能被认为是中断(比如明确需要处理异常)。尽管如此,如果至少记录了异常,ClassNotFoundException 会更快地揭示实际问题。 @Kayaman 的回答是正确的解释。【参考方案2】:

也就是说,您的 Connection connect = getConnection() 返回了 null。 检查您的数据库属性是否正确。

【讨论】:

我已经检查过它们是否正确,正如我上面写的,我已经通过 mysql workbench 连接到具有这些属性的数据库 所以请确保您有 MySQL 连接器。您可以在 maven 存储库中找到更适合您的:link 我有一个连接器并将其添加到构建路径中 我无法指定为什么它为空,但您的 getConnection() 方法返回空。您可以调试它来查找原因。

以上是关于servlet 的数据库连接问题 - Java webapp [重复]的主要内容,如果未能解决你的问题,请参考以下文章

servlet 的数据库连接问题 - Java webapp [重复]

尝试通过 servlet 连接 mySql 时出现“java.lang.ClassNotFoundException”

java servlet在java servlet中配置数据库连接池的配置(在server.xml)

Java servlet (tomcat) 跟踪到多个数据库的多个 jdbc 连接

使用 Java servlet 时何时打开以及何时关闭 mysql 连接?

servlet中Java连接数据库后的基本操作