java.lang.NullPointerException-登录servlet

时间:2014-07-10 16:57:06

标签: java mysql servlets

我最近开始编程java。 我在我的serlvet中得到java.lang.NullPointerException。代码发布在下面。有人可以帮我吗?

我使用mysql-用户名,密码等都是正确的。我可以看到表中的值。

控制台中的

消息 -

显示java.lang.NullPointerException

at j2ee.Authenticate.processRequest(Authenticate.java:49)

at j2ee.Authenticate.doGet(Authenticate.java:93)

代码 -

package j2ee;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
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(name = "Authenticate", urlPatterns = {"/Authenticate"})
public class Authenticate extends HttpServlet {


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    String user = request.getParameter("userId");
    String pwd = request.getParameter("passwd");
    String dbuser = null;
    String dbpwd = null;

    try
{
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/j2ee","root","password");

    String query = "select username, password from user_info where username=? && password=?";

     PreparedStatement p = con.prepareStatement(query);
     p.setString(1,dbuser);  
     p.setString(2,dbpwd);  

     ResultSet rs=p.executeQuery();





     if(dbuser.equals(user) && dbpwd.equals(pwd))
    {
            String s=request.getParameter(user);
            out.println("Welcome" +s); 
            RequestDispatcher rd = request.getRequestDispatcher("Home");
            rd.include(request, response);

    }   
    else
    {
            out.println("Please enter a valid Username and Password!"); 
            RequestDispatcher rd = request.getRequestDispatcher("Login");
            rd.include(request, response);

    }

}
    catch (IOException e)
    {
    System.out.println(e);
    } catch (ClassNotFoundException e) {
        System.out.println(e);
    } catch (SQLException e) {
        System.out.println(e);
    } catch (ServletException e) {
        System.out.println(e);
    }


}

3 个答案:

答案 0 :(得分:0)

dbuser和dbpwd被初始化为null并且从未分配过值。看起来您正在尝试针对表验证登录,但您永远不会从ResultSet对象中读取结果。我想你想这样做:

String query = "select username, password from user_info where username=? && password=?";

     PreparedStatement p = con.prepareStatement(query);
     p.setString(1,user);  
     p.setString(2,pwd);  

     ResultSet rs=p.executeQuery()

     if ( rs.next() ) {
        dbuser = rs.getString(1);
        dbpwd  = rs.getString(2);
      }
     // etc ...

也许请阅读如何在IDE和how to use result sets

中进行调试

答案 1 :(得分:0)

您滥用prepareStatement函数,请

String query = "select username, password from user_info where username=? && password=?";

PreparedStatement p = con.prepareStatement(query);
p.setString(1,dbuser);   //wrong, you are replacing ? with null
p.setString(2,dbpwd);    //wrong, you are replacing ? with null

您应该计算行数。

String query = "select count(*) from user_info where username=? && password=?";
p.setString(1,user);
p.setString(2,pwd);  
ResultSet rs=p.executeQuery()

int result = rs.getInt(1);
if(result >= 1){ 
   ..authen OK
}
else{
   ..authen failed
}

答案 2 :(得分:0)

你永远不会设置dbuser和dbpwd的值,你已经用null初始化它们,但是你在PreparedStatement中使用它。