2016-12-23 6 views
0

Ich kam vor kurzem nach einer beträchtlichen Zeit mit Python zu Java zurück und versuche, mich wieder damit vertraut zu machen. Mein erstes gewünschtes Projekt bestand darin, eine kleine Anwendung zu erstellen, bei der man sich (zuerst) einloggen kann. Ich benutze mySQL, um die Datenbank von Benutzernamen und Passwörtern zu halten.Wie extrahiere ich eine Variable aus anderen Klassen oder Methoden?

Bisher habe ich Java's Swing-GUI verwendet, um eine Popup-Box zu erstellen, die nach Anmeldeinformationen fragt. Der eingegebene Benutzername und das Passwort werden mit denen in der SQL-Tabelle verglichen.

Das Problem ist, dass ich eine while-Schleife verwende, um die Eingaben gegen die SQL-Tabelle zu testen. Daher wird die eingegebene Information mit jedem Schlüssel und Wert in einer Hashmap verglichen, die aus der SQL-Tabelle erstellt wurde.

Ich bin nicht sicher, wie ich meine Variable g (die Hashmap) aus der while-Schleife und der try-Anweisung von SQL "extrahiere", damit ich sie benutzen kann, nachdem sie mit den Daten von mySQL gefüllt wurde.

Ich benutze Eclipse (Java Neon).

Ich habe keine Ahnung, wie die hashmap "extrahieren", und wenn ich versuche, die while-Schleife oder try Anweisung die hashmap zurückgeben, informiert mich Eclipse, dass void-Methoden keinen Wert (deutlich) zurückgeben können. Allerdings kann ich den Rückgabetyp nicht von void zu HashMap ändern) String, String>, weil "Der Rückgabetyp ist nicht kompatibel mit ActionListener.actionPerformed (ActionEvent e)" und "implementiert java.awt.event.ActionListener.actionPerformed".

Hier ist mein Code:

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.util.HashMap; 
import java.util.Map; 

public class Hello0 extends JFrame { 
    private static final long serialVersionUID = 1487932324102279819L; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Frame Demo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(350, 200); 

     JPanel panel = new JPanel(); 
     frame.add(panel); 
     placeComponents(panel); 

     frame.setVisible(true); 
    } 


    private static void placeComponents(JPanel panel) { 

     panel.setLayout(null); 
     JLabel userLabel = new JLabel("Username"); 
     userLabel.setBounds(10, 20, 80, 25); 
     panel.add(userLabel); 

     JTextField userText = new JTextField(20); 
     userText.setBounds(100, 20, 165, 25); 
     panel.add(userText); 

     JLabel passwordLabel = new JLabel("Password"); 
     passwordLabel.setBounds(10, 50, 80, 25); 
     panel.add(passwordLabel); 

     JPasswordField passwordText = new JPasswordField(20); 
     passwordText.setBounds(100, 50, 165, 25); 
     panel.add(passwordText); 

     JButton loginB = new JButton("Login"); 
     loginB.setBounds(10, 80, 80, 25); 
     panel.add(loginB); 

     loginB.addActionListener(new ActionListener() { 

      public HashMap<String, String> actionPerformed(ActionEvent e) { 
       String username0 = "root"; 
       String password = "javaSQLmy98"; 
       try { 

        String url = "jdbc:mysql://localhost:3306/javabase?useSSL=false"; 
        Connection connection = DriverManager.getConnection(url, username0, password); 
        PreparedStatement stmt0 = connection.prepareStatement("SELECT * from userids"); 

        String pass0 = null; 
        String user1 = userText.getText().toString(); 
        char[] pass1 = passwordText.getPassword(); 
        pass0 = String.valueOf(pass1); 
        System.out.println(user1); 
        System.out.println(pass1); 

        ResultSet rs = stmt0.executeQuery(); 
        rs = stmt0.executeQuery("SELECT * from userids "); 
        while (rs.next()) { 

         String user = rs.getString("username"); 
         String pass = rs.getString("paswrd"); 

         Map<String, String> g = new HashMap<>(); 
         g.put(user, pass); 
         return g; 
         // This was the alternative: if(g.keySet().contains("Jacob") && g.values().contains("root")) { 


         /*This code below was originally outside the while loop but I could not 
         figure out how to make it work without it being inside, and accessible 
         to the hashmap g. Now it is being checked each time the while loop 
         is ran, with a new pair of usernames and passwords on each loop. */ 

         if (user1.equals(user) && pass0.equals(pass)) { 
          System.out.println("Good!"); 
         } 

         /*The problem here is that the checker IS inside the loop, so it 
         tests the input against each of the entries in the SQL table. */ 
         else { 
          System.err.println("The username or password is incorrect."); 
         } 
        } 

        connection.close(); 
       } catch (Exception e1) { 
        System.err.println(e1.getMessage()); 
       } 

      } 
     }); 

    } 

} 

Prost!

+0

Warum laden Sie alles in eine HashMap, anstatt nur eine WHERE-Klausel in Ihre SQL-Abfrage aufzunehmen? –

+0

Verstehen Sie, wie Sie eine Abfrage in SQL schreiben, um die einzelne Zeile für die Benutzer-ID abzurufen, anstatt alle Zeilen in der Tabelle zu durchlaufen? –

+0

@RiaanNel Ich bin mir nicht sicher, wie das helfen würde. Funktioniert das WHERE-Schlüsselwort nicht nur als Filter? –

Antwort

0

Wenn Sie Ihrer Abfrage eine WHERE-Klausel hinzufügen, werden nur die Daten zurückgegeben, die den Kriterien entsprechen. Mit anderen Worten, die Abfrage unten (offensichtlich mit den richtigen Werten) wird den angegebenen Benutzer-ID-Eintrag zurückgeben, wenn es existiert, andernfalls wird eine leere Ergebnismenge zurückgegeben.

SELECT * from userids 
WHERE userName = 'user1' 
AND passwrd = 'pass1' 

Sie können dann mit der gesamten abschaffen while-Schleife und die HashMap, und der Code kann wie folgt vereinfacht werden:

if (rs.next()) { 
    System.out.println("Good!"); 
} else { 
    System.err.println("The username or password is incorrect."); 
} 

auch nach wie vor vorgeschlagen, wenn dies etwas mehr als eine ist Programmieraufgabe, sollten Passwörter Hash statt statt im Klartext gespeichert werden.

+0

Das ist gut für die spezifischen Werte 'user1' und 'pass1', aber wie würde ich den Benutzernamen und das Passwort verwenden? –

+0

Entweder gute alte String Verkettung entlang der Linien von "SELECT ..." + Benutzer + "AND ..." + Pass (was schlecht ist, weil Sie anfällig für SQL-Injektion bleibt), oder Sie können eine PreparedStatement (die bevorzugte Option). http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html –

+0

Haben Sie eine Lösung für Ihr Problem gefunden? Wenn ja, markieren Sie eine Antwort als akzeptiert. http://stackoverflow.com/help/someone-answers –

1

g außerhalb des while zugreifen zu können, müssen Sie es erklären, außerhalb des while, wie jeder {} in Java Variablen Tive im Inneren. So

Map<String, String> g = new HashMap<>(); 
while (condition) { 
    // do something 
    g.put(key, value); 
} 
// do something with g 

Aber in diesem Fall können Sie die Prüfung direkt in SQL tun, die viel effektiver sein sollte.


Randbemerkung:

keine Passwörter lagern. Don't store passwords.Hash+Salt passwords (or better, use a library).

+0

Vielen Dank für die gute Antwort und Vorschläge. Wird es außerhalb der while-Schleife deklariert, wird dann eine leere Hashmap erstellt? Und dann fülle ich es innerhalb der While-Schleife, aber kann es jetzt draußen verwenden, wo es deklariert wurde? –

+0

@JacobAdamczyk genau – CAD97

0

Try this:

Map<String, String> g = new HashMap<String, String>(); 
while(rs.next()) { 
    String user = rs.getString("username"); 
    String pass = rs.getString("paswrd"); 
    g.put(user, pass); 

    ..... 
} 

Hinweis: Unter Benutzernamen als Schlüssel in HasmMap keine gute Programmierung ist, denn es gibt mehrere Benutzer mit demselben Namen sein kann.

+0

Welche andere Datenstruktur würden Sie dann empfehlen? –

+0

Das hängt von Ihrer aktuellen Anforderung ab. Sie können ein Set haben oder wenn Sie mit Karte gehen möchten, dann können Sie mit Karte gehen . Wobei Schlüssel Ihre Benutzer-ID vom Typ long und Wert POJO-Klasse sein wird. – SujitKumar

+0

Oben POJO-Klasse wird Eigenschaften wie userId, Benutzername, Passwort usw. haben. – SujitKumar

Verwandte Themen