2013-12-04 3 views
-1

У меня есть страница входа в систему и когда введены данные для входа в систему, цикл while обращается к базе данных для проверки входов, но если у меня есть 3 записи в базе данных и входы неверны, отображается сообщение об ошибке 3 раза, и если входы правильные, сообщение об ошибке отображается дважды. Я знаю, почему это происходит (из-за цикла while), но я не могу понять, как противодействовать этому. код ниже:while loop возвращающее сообщение об ошибке несколько раз

package securitySystem; 

import java.awt.*; 
import javax.swing.*; 
import java.sql.*; 
import java.awt.event.*; 

public class loginPage extends JFrame { 

public static void main (String args[]){ 
    loginPage gui= new loginPage(); 
    gui.setSize (400, 400); 
    gui.setLocationRelativeTo(null); 
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    gui.setVisible(true); 
    gui.setTitle("Login Page"); 

} 

JLabel lblUserName= new JLabel("UserName:"); 
JTextField txtUserName= new JTextField(15); 
JLabel lblPassword= new JLabel("Password:"); 
JTextField txtPassword= new JTextField(15); 
JButton btnForgotten= new JButton("Forgotten Login"); 
JButton btnLogin= new JButton("Login"); 

public loginPage(){ 
    setLayout (null); 

    //JLabel lblUserName= new JLabel("UserName:"); 
    lblUserName.setBounds(100,100,110,30); 
    add(lblUserName); 

    //JTextField txtUserName= new JTextField(15); 
    txtUserName.setBounds(170,100,110,30); 
    add(txtUserName); 

    //JLabel lblPassword= new JLabel("Password:"); 
    lblPassword.setBounds(100,150,110,30); 
    add(lblPassword); 

    //JTextField txtPassword= new JTextField(15); 
    txtPassword.setBounds(170,150,110,30); 
    add(txtPassword); 

    //JButton btnLogin= new JButton("Login"); 
    btnLogin.setBounds(100,300, 70, 30); 
    add(btnLogin); 
    actionlogin(); 

    //JButton btnForgotten= new JButton("Forgotten Login"); 
    btnForgotten.setBounds(175,300, 130, 30); 
    add(btnForgotten); 


} 

public void actionlogin() 
{ 
    btnLogin.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 

      String username = txtUserName.getText(); 
      String password = txtPassword.getText(); 

      String databaseUsername = ""; 
      String databasePassword = ""; 

      String dataSourceName = "securitySystem"; 
      String dbUrl = "jdbc:odbc:" + dataSourceName; 

      try{ 
       //Type of connection driver used  
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

       //Connection variable or object param: dbPath, userName, password 
       Connection con = DriverManager.getConnection(dbUrl, "", ""); 

       Statement statement = con.createStatement(); 

       ResultSet rs = statement.executeQuery("select username, password from employee"); 



       while(rs.next()) 
       { 
        if(username.equals(rs.getString("username")) && password.equals(rs.getString("password"))) 
        { 
         adminMenu gui =new adminMenu(); 
         gui.setSize (400, 400); 
         gui.setLocationRelativeTo(null); 
         gui.setVisible(true); 
         dispose(); 
        } 
        else 
        { 
         JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect"); 
         txtUserName.setText(""); 
         txtPassword.setText(""); 
         txtUserName.requestFocus(); 
        }  
       } 

       statement.close(); 
       con.close(); 
      }catch (Exception e) { 
       try { 
        throw e; 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      }      
     } 
    }); 
} 

}

ответ

1

Вы должны добавить break; заявление для выхода из цикла, когда вы потерпели неудачу.

else 
{ 
    JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect"); 
    txtUserName.setText(""); 
    txtPassword.setText(""); 
    txtUserName.requestFocus(); 
    break; // <-- this is needed 
} 

Ваша логика также выглядит сломанной. Не должно быть больше как (псевдо-код):

if (record matches username) { 
    if (password correct) { 
    login(); 
    } else { 
    show an error 
    } 
} else { 
    go around loop again 
} 
+0

PERFECT, знал, что это простое исправление – Adam

+0

@Adam Проверьте мое редактирование - я думаю, у вас есть другие проблемы. –

+0

изменил его, но не поставил последнее место! – Adam

0

Вы должны решить эту проблему с флагом, то будет чище, чем break.

  boolean nomatches=true; 
      while(rs.next()) 
      { 
       if(username.equals(rs.getString("username")) && password.equals(rs.getString("password"))) 
       { 
        adminMenu gui =new adminMenu(); 
        gui.setSize (400, 400); 
        gui.setLocationRelativeTo(null); 
        gui.setVisible(true); 
        dispose(); 
        nomatches=false; 
       }  
      } 

      if(nomatches) { 
        JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect"); 
        txtUserName.setText(""); 
        txtPassword.setText(""); 
        txtUserName.requestFocus(); 
      } 
0

Я думаю, что это более чем заявление о прорыве, здесь у вас есть логическая ошибка. Вы сказали: «Если входы верны, сообщение об ошибке отображается дважды». Таким образом, нам нужно выйти из цикла или прекратить итерацию при успешном завершении, поэтому добавьте выражение «break» в случае успеха. Если вы не хотите разрывать цикл, вы можете просто использовать «продолжить» вместе с переменной флага. Если случай успешный когда-либо, обновите флаг как 1. (Не забудьте инициализировать флаг как 0 при создании). И прежде чем приступить к делу, проверьте значение флага, в зависимости от него, перерыв или продолжение следующей итерации.

0

Хм, я не понимаю, почему вы проверяете вход таким образом. Это более удобно использовать другой SQL-запрос:

'select count(*) from employee where username = @username and password = @password' 

заменить @username и @password с вашими входными значениями, если результат утверждения 0, входы неверны, если результат = 1 правильно.

С помощью этого решения вам не нужен цикл while.

Смежные вопросы