在servlet登录应用程序中找不到列的execption

时间:2015-06-21 20:14:18

标签: java mysql servlets login

我正在使用java servlet和mysql开发登录应用程序,当我尝试通过提供用户名和密码登录时出现以下错误。

java.sql.SQLException: Column 'alex' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:987)
at com.mysql.jdbc.ResultSet.getString(ResultSet.java:5584)
at org.kaveen.login.database.LoginDaoImpl.userValidate(LoginDaoImpl.java:36)
at org.kaveen.login.controller.Login.doPost(Login.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
..................................

这是我的LoginDaoImpl类

public class LoginDaoImpl implements LoginDao {

public String userValidate(LoginBean loginBean) {

    String userName = loginBean.getUserName();

    String password = loginBean.getPassword();
    System.out.println(userName);
    System.out.println(password);
    String sql = "select username,password from users";
    String userNameDB = "";
    String userPasswordDb = "";

    Connection connection = null;
    java.sql.Statement statement = null;

    ResultSet resultSet = null;

    try {
        connection = DbConnecton.setConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(sql);
        while (resultSet.next()) {
            userNameDB = resultSet.getString(userName);
            userPasswordDb = resultSet.getNString(password);
            if (userName.equals(userNameDB)
                    && password.equals(userPasswordDb)) {
                return "Success";
            }
        }
    } catch (SQLException e) {

        e.printStackTrace();
    }

    return "Failed invalid credentials";
   }
  }

任何人都可以解释为什么我收到此错误?我该如何解决?

3 个答案:

答案 0 :(得分:1)

您正尝试使用名为" alex"?的用户名登录这是你的错误:

userNameDB = resultSet.getString(userName);

在ResultSet上使用方法getString时,您可以指定结果中列的列索引(从1开始),或列名称(在您的情况下,列名称为" username") 。您正在将实际用户名传递给方法,当然该列不存在。

试试这个:

userNameDB = resultSet.getString("username");

答案 1 :(得分:0)

你在做什么是非常错误的。您的查询从users表中获取所有行,并且您正在迭代它。

要更正它,您必须在从结果集中获取数据时传递列的名称。

userNameDB = resultSet.getString(userNameColumn);
userPasswordDb = resultSet.getNString(passwordColumn);

但这种方式非常愚蠢。您可以使用简单的查询在数据库中执行此操作。 使用此查询,不需要迭代。

select * from users where username_col=username and password_col=password

假设您将密码存储在原始文本中是错误的。

答案 2 :(得分:0)

您应该准备一个SQL查询来检查您的用户凭据是否匹配,循环结果集可能代价高昂(当用户数量很高时)。

String sql = "select username, password from users where username=:username and password = :pass";

Connection connection = null;
java.sql.Statement statement = null;

ResultSet resultSet = null;

try {
    connection = DbConnecton.setConnection();
    statement = connection.createStatement();
    resultSet= statement.executeQuery(sql);
    resultSet.setString("username", username );
    resultSet.setString("pass", password );
    if (resultSet.hasNext()){ // check if we had found someone with same username and password
       return "Success";
    }
} catch (SQLException e) {
    e.printStackTrace();
}finally {
 if(connection!=null)// finaly remember to close connection if open
 connection.close()
}
return "Failed invalid credentials";