2015-04-18 32 views
0

我從來沒有用過JAVA的數據庫,所以請耐心等待。我堅持MySQL查詢。 我正在創建一個GUI,用戶在訪問主頁面之前必須輸入他的電子郵件地址以及密碼。當用戶點擊提交按鈕時,數據庫連接被設置,並且有一個MySQL查詢選擇對應於輸入數據的字段。 使用PHP,我通常會使用$ _POST來獲取輸入的數據,但對於JAVA GUI,我已經瞭解到我需要保存輸入的數據,這是我所做的。 現在,在select語句之後,如果電子郵件地址和密碼正確,我應該顯示另一個窗口。 這就是我卡住的地方。另一個窗口不顯示,我不知道如何驗證登錄輸入的數據。JAVA等同於驗證登錄信息?

請找我的代碼如下:

LoginForm.java:

package interfaceGUI; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JButton; 

import java.awt.Button; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.sql.DriverManager; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.sql.ResultSet; 

public class LoginForm extends JFrame{ 

private JLabel loginEmail; 
private JLabel loginPass; 
private JTextField loginTextField; 
private JPasswordField loginPassField; 
private JButton submit; 
private JPanel loginArea; 
private JPanel buttonArea; 

public LoginForm() 
{ 
    super("Party Supplies Rental"); 
    setLayout(new FlowLayout()); 

    loginEmail = new JLabel("Enter Your Email Address: "); 
    loginTextField = new JTextField(20); 
    loginPass = new JLabel("Enter Your Password: "); 
    loginPassField = new JPasswordField(20); 

    loginArea = new JPanel(); 
    loginArea.setLayout(new GridLayout(2,2)); 

    loginArea.add(loginEmail); //add to the JPanel 
    loginArea.add(loginTextField); 
    loginArea.add(loginPass); 
    loginArea.add(loginPassField); 
    add(loginArea); //add JPanel to the frame 

    submit = new JButton("Submit"); 
    buttonArea = new JPanel(); 
    buttonArea.setLayout(new GridLayout(1,2)); 
    buttonArea.add(submit); 
    add(buttonArea); 

    ButtonHandler handler= new ButtonHandler(); 

    submit.addActionListener(handler); 
} 

public class ButtonHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent event) 
    { 
     if(event.getSource() == submit) 
     { 

      String loginText = loginTextField.getText(); 
      char[] passText = loginPassField.getPassword(); 

      String url = "jdbc:mysql://localhost/"; 
      String dbName = "partySupplies"; 
      String driver = "com.mysql.jdbc.Driver"; 
      String username = "root"; 
      String pw = ""; 

      try 
      { 
       Class.forName(driver).newInstance(); 
       Connection conn = DriverManager.getConnection(url+dbName,username,pw); 
       //System.out.println("Connected"); 

       Statement s = conn.createStatement(); 


       //s.execute("INSERT INTO login VALUES('2', 'Krishna', 'Rohee', 'Grand Bois', '56546546', '[email protected]', 'daminimobbdou')"); 

       s.execute("SELECT custEmailAdd, custPassword FROM login WHERE custEmailAdd = 'loginText' AND custPassword = 'passText'"); 
       ResultSet rs = s.getResultSet(); 
       int rowCount = rs.getRow(); 

       //while loop here to check for login data 
       { 
       dispose(); 
       Main main = new Main(); 
       main.setSize(500,200); 
       main.setVisible(true); 
       conn.close(); 
       } 
      } 

      catch(Exception e) 
      { 
        e.printStackTrace(); 
      } 
      } 

    } 
} 

} 

的Main.java:

package interfaceGUI; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JPasswordField; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JButton; 

import java.awt.Button; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Main extends JFrame{ 

private JLabel label; 
private JPanel forLabel; 
private JButton birthdayCategory; 
private JButton summerCategory; 
private JButton halloweenCategory; 
private JPanel forCategory; 


public Main() 
{ 
    super("Home"); 
    setLayout(new FlowLayout()); 

    label = new JLabel("Choose the Party Category"); 
    forLabel = new JPanel(); 
    forLabel.setLayout(new GridLayout(1,3)); 
    forLabel.add(label); 
    add(forLabel); 

    birthdayCategory = new JButton("Birthday Party"); 
    summerCategory = new JButton("Summer/Festive Party"); 
    halloweenCategory = new JButton("Halloween Party"); 
    forCategory = new JPanel(); 
    forCategory.setLayout(new GridLayout(1,3)); 
    forCategory.add(birthdayCategory); 
    forCategory.add(summerCategory); 
    forCategory.add(halloweenCategory); 
    add(forCategory); 
} 

} 

簡單地說,當在提交用戶點擊按鈕,我想驗證用戶輸入的數據,然後顯示Main.java窗口。 請指點我正確的方向。謝謝。

回答

1

你不及格loginTextpassText到SQL查詢,讓您的數據庫接收到這個查詢完全按照你寫的:

"SELECT custEmailAdd, custPassword FROM login WHERE custEmailAdd = 'loginText' AND custPassword = 'passText'" 

爲了通過您的變量的值,你需要將它們插入到這條SQL語句,就像這樣:

s.execute(String.format("SELECT custEmailAdd, custPassword FROM login WHERE custEmailAdd = '%s' AND custPassword = '%s'", loginText, new String(passText))); 

但有更好的表現我建議你用PreparedStatement

PreparedStatement ps = con.prepareStatement("SELECT custEmailAdd, custPassword FROM login WHERE custEmailAdd = ? AND custPassword = ?"); 
ps.setString(1, loginText); 
ps.setString(2, new String(passText)); 
ResultSet rs = ps.executeQuery(); 

至於檢查結果集,您可能只驗證是否至少返回一個結果:如果是,那麼具有此類憑證的用戶存在,如果不存在 - 則不存在具有此類憑證的用戶。

if(rs.next()) 
{ 
    dispose(); 
    Main main = new Main(); 
    main.setSize(500,200); 
    main.setVisible(true); 
    conn.close(); 
} 
else 
{ 
    // show some error 
} 

順便說一句,這是非常糟糕的做法來初始化動作監聽數據庫連接。您最好在靜態塊或構造函數中進行初始化,因爲這是一個耗時的操作。同樣你也會受益,如果能解決PreparedStatement的構造函數。然後您只需在需要的地方設置參數並執行請求。

+0

感謝您花時間回答我的問題。過了一會兒,我發現我傳遞了錯誤的值。通過僅檢查行數來簡化操作。我將使用PreparedStatement來代替。 –