我如何 "extract" 来自其他 类 或方法的变量?
How do I "extract" a variable from other classes or methods?
我在 Python 呆了很长一段时间后,最近又回到了 Java,我正试图再次适应 table。我的第一个想要的项目是制作一个小应用程序,您可以在其中(首先)登录。我正在使用 mySQL 来保存用户名和密码的数据库。
到目前为止,我已经使用 Java 的 swing GUI 制作了一个弹出框,询问登录信息。输入的用户名和密码将根据 SQL table.
中的用户名和密码进行测试
问题是我正在使用 while 循环来测试 SQL table 的输入。因此,根据 SQL table.
创建的 Hashmap 中的每个键和值检查输入的信息
我不确定如何从 while 循环和 SQL 的 try 语句中 "extract" 我的变量 g(Hashmap),以便我可以在它被填充后使用它来自 mySQL.
的数据
我正在使用 Eclipse(Java Neon)。
我不知道如何 "extract" hashmap,当我尝试使用 while 循环或 try 语句 return hashmap 时,Eclipse 通知我 void 方法不能 return 一个值(显然)。但是,我无法将 return 类型从 void 更改为 HashMap)String, String> 因为 "The return type is incompatible with ActionListener.actionPerformed(ActionEvent e)" 和 " implements java.awt.event.ActionListener.actionPerformed".
这是我的代码:
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());
}
}
});
}
}
干杯!
要在 while
之外访问 g
,您需要在 while
之外声明它,因为 Java 范围变量中的每个 {}
在里面。因此,
Map<String, String> g = new HashMap<>();
while (condition) {
// do something
g.put(key, value);
}
// do something with g
但这种情况下,直接在SQL内进行检查,应该会更有效。
旁注:
不存储密码。 Don't store passwords. Hash+Salt passwords (or better, use a library).
试试这个:
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);
.....
}
注意:在 HashMap 中以用户名作为键不是一个好的编程,因为可以有多个用户同名。
如果您在查询中添加 WHERE 子句,它将 return 仅显示符合条件的数据。换句话说,下面的查询(显然具有正确的值)将 return 指定的用户 ID 条目(如果存在),否则它将 return 一个空结果集。
SELECT * from userids
WHERE userName = 'user1'
AND passwrd = 'pass1'
这样就可以去掉整个while循环和HashMap,代码可以简化如下:
if (rs.next()) {
System.out.println("Good!");
} else {
System.err.println("The username or password is incorrect.");
}
此外,如前所述,如果这不仅仅是一个编程练习,密码应该被散列而不是以纯文本形式存储。
我在 Python 呆了很长一段时间后,最近又回到了 Java,我正试图再次适应 table。我的第一个想要的项目是制作一个小应用程序,您可以在其中(首先)登录。我正在使用 mySQL 来保存用户名和密码的数据库。
到目前为止,我已经使用 Java 的 swing GUI 制作了一个弹出框,询问登录信息。输入的用户名和密码将根据 SQL table.
中的用户名和密码进行测试问题是我正在使用 while 循环来测试 SQL table 的输入。因此,根据 SQL table.
创建的 Hashmap 中的每个键和值检查输入的信息我不确定如何从 while 循环和 SQL 的 try 语句中 "extract" 我的变量 g(Hashmap),以便我可以在它被填充后使用它来自 mySQL.
的数据我正在使用 Eclipse(Java Neon)。
我不知道如何 "extract" hashmap,当我尝试使用 while 循环或 try 语句 return hashmap 时,Eclipse 通知我 void 方法不能 return 一个值(显然)。但是,我无法将 return 类型从 void 更改为 HashMap)String, String> 因为 "The return type is incompatible with ActionListener.actionPerformed(ActionEvent e)" 和 " implements java.awt.event.ActionListener.actionPerformed".
这是我的代码:
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());
}
}
});
}
}
干杯!
要在 while
之外访问 g
,您需要在 while
之外声明它,因为 Java 范围变量中的每个 {}
在里面。因此,
Map<String, String> g = new HashMap<>();
while (condition) {
// do something
g.put(key, value);
}
// do something with g
但这种情况下,直接在SQL内进行检查,应该会更有效。
旁注:
不存储密码。 Don't store passwords. Hash+Salt passwords (or better, use a library).
试试这个:
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);
.....
}
注意:在 HashMap 中以用户名作为键不是一个好的编程,因为可以有多个用户同名。
如果您在查询中添加 WHERE 子句,它将 return 仅显示符合条件的数据。换句话说,下面的查询(显然具有正确的值)将 return 指定的用户 ID 条目(如果存在),否则它将 return 一个空结果集。
SELECT * from userids
WHERE userName = 'user1'
AND passwrd = 'pass1'
这样就可以去掉整个while循环和HashMap,代码可以简化如下:
if (rs.next()) {
System.out.println("Good!");
} else {
System.err.println("The username or password is incorrect.");
}
此外,如前所述,如果这不仅仅是一个编程练习,密码应该被散列而不是以纯文本形式存储。