2014-09-15 3 views
1

У меня есть форма, которая отправляет запросы на сервлетов. Я создал класс DbConnection, который управляет аутентификацией по базе данных MySQL, которая отлично работает, когда я тестирую ее со статическим основным методом. Когда я использовал этот класс в своем сервлете, он продолжает давать мне эту ошибку.Java Servlet JDBC authentification

Что не так с моим кодом?

Это класс DbConnection.

package com.cloud.db; 

public class DbConnection { 

    private Connection conn; 
    private String user = NAME; 
    private String passwd = SOME_PASSWORD; 
    private Statement stmt; 
    private ResultSet result; 
    private PreparedStatement auth; 

    public DbConnection() { 
     try { 
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cloudbase", user, passwd); 
      stmt = conn.createStatement(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public boolean authenticate(String usrname, String pwd) throws SQLException { 
     PreparedStatement stm = conn.prepareStatement("select * from users where email=? and password = ?"); 
     stm.setString(1, usrname); 
     stm.setString(2, pwd); 
     ResultSet result = stm.executeQuery(); 

     if (result.next()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

Вот мой сервлет

package com.cloud.db; 

import com.cloud.*; 
import java.sql.*; 
import java.io.IOException; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet("/auth") 
public class Auth extends HttpServlet { 

    private static final long serialVersionUID = 1L; 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public Auth() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
    * response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 
    * response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String email = request.getParameter("email"); 
     String passwd = request.getParameter("pwd"); 
     DbConnection connect = new DbConnection(); 

     try { 
      new DbConnection().authenticate("[email protected]", "password"); 
     } catch (SQLException e) { 
      System.out.println("Error :" + e.getMessage()); 
     } 
    } 
} 
+1

Какая ошибка? –

+0

Etat HTTP 500 - типа Раппорт d' 'исключение сообщение описание Le Serveur RENCONTRE ипе ERREUR интерн Квай l'' а empêché де ла satisfaire requête. исключение java.lang.NullPointerException \t com.cloud.db.DbConnection.authenticate (DbConnection.java:25) \t com.cloud.db.Auth.doPost (Auth.java:46) \t javax.servlet.http.HttpServlet.service (HttpServlet .java: 644) \t javax.servlet.http.HttpServlet.service (HttpServlet.java:725) \t org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilter.java:52) к сожалению для французов im французский родной. Это ошибка, возникающая при отправке формы – Dario

+0

Какая строка в вашем коде DbConnection.java:25 и Auth.java:46? –

ответ

1

Вы можете сделать это таким образом, также

public class ConnectionProvider { 
    public static Connection getConnection() throws SQLException { 
     Connection connection = null; 
     connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/cloudbase" 
                     ,user,passwd); 
     return connection; 
    } 

    public void authenticate(Connection connection,String usrname,String pwd) 
     throws SQLException { 
    String query = "select firstName from users where email=? and password = ?"; 
    try { 
     PreparedStatement stm = connection.prepareStatement(query); 
     stm.setString(1, usrname); 
     stm.setString(2, pwd); 
     ResultSet result = stm.executeQuery(); 
     if (resultSet.next()) { 
      do { 
       System.out.println("Welcome, "+resultSet.getString("firstName")); 
      } while(resultSet.next()); 
     } 
     else{ 
      System.out.println("Username or id doesnot exist"); 
    } 
    } catch (SQLException e) { 
     System.out.println("Error :" + e.getMessage()); 
    } 
    finally{ 
     connection.close(); 
} 

} 

Затем в Servlet

protected void doPost(...) throws ServletException, IOException { 
    String email = request.getParameter("email"); 
    String passwd = request.getParameter("pwd"); 
    Connection connection = ConnectionProvider.getConnection(); 
    new ConnectionProvider().authenticate(connection,email ,passwd);  

} 
1

Основываясь на том, что вы писали, я бы сказал, что проблема здесь:

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cloudbase",user,passwd); 
stmt = conn.createStatement(); 

DriverManager.getConnection возвращается null и, null.create. .. бросает NPE.

Как вы можете убедиться, что: Поставьте SYSOUT после conn = ... и посмотреть, если соединение нулевой Как исправить: 1) убедитесь, что класс водитель находится в пути к классам и он был загружен. 2) Перед использованием объекта убедитесь, что он был инициализирован.

1

Самая большая разница между запуском кода локально и в tomcat - это расположение драйвера JDBC, поэтому наиболее вероятной проблемой является то, что Tomcat не может найти драйвер JDBC. Tomcat ожидает найти драйвер в $ CATALINA_HOME/lib. Существуют инструкции по настройке источника данных MySQL here.

В настоящее время ваша обработка исключений скрывает, что происходит. Исходная проблема возникает в конструкторе DBConnection, но поскольку исключение попадает, метод проверки подлинности идет вперед и запускается с нулевым соединением, в результате чего возникает исключение NullPointerException.

Tomcat должен записывать исключение, сгенерированное в конструкторе DBConnection, на консоль, поэтому вы можете посмотреть там, чтобы найти исходную проблему. Чтобы исправить обработки исключений, вы можете изменить код DbConnection на что-то вроде:

public boolean authenticate(String usrname,String pwd) throws SQLException { 
    Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/cloudbase",user,passwd); 
    try { 
     PreparedStatement stm = conn.prepareStatement(
     "select * from users where email=? and password = ?"); 
     stm.setString(1, usrname); 
     stm.setString(2, pwd); 
     ResultSet result = stm.executeQuery(); 
     return result.next(); 
    } finally { 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      // use a logger instead of stdout 
      log.info("close caused exception", e); 
     } 
    } 
} 

Это гарантирует, что исключение брошено является тот, который вызвал исходную задачу.

1

вы не загружен драйвер MySQL, поэтому DriverManager возвращается null.In JDBC, мы должны необходимо зарегистрировать Driver (Mysql Driver в вашем случае).

Class.forName("com.mysql.jdbc.Driver"); 
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cloudbase", user, passwd); 
    /* your remaining code .... 
    ...*/