【发布时间】:2021-03-21 01:55:17
【问题描述】:
我正在创建一个简单的聊天应用程序,用户需要登录,然后它连接到一个 mysql 表,该表根据现有记录检查用户名和密码。它检索用户名结果集并将其传递到一个字符串中,然后从该字符串中对其进行检查。我希望服务器类可以访问输入,以便可以使用用户名将消息存储到数据库中。然后,服务器通过Runtime.getRuntime().exec() 打开一个充当聊天室的命令提示符窗口。我尝试了getter,但java告诉我字符串为空。
这是我声明变量的客户端类:
public class Client {
static final String url = "jdbc path to database";
static final String user = "myuser";
static final String passwd = "mypassword";
final static int ServerPort = 5000;
static String serverAddress;
static Scanner in;
static PrintWriter out;
static Scanner scan = new Scanner(System.in);
static boolean menuloop = true;
public static String usern;
static int choice, choice0, choice1;
public Client(String serverAddress) {
this.serverAddress = serverAddress;
}
那么这是整个Client的类方法:
public static void login() {
boolean validate = false;
do {
try {
validate = true;
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, passwd);
System.out.println("Connection established");
Scanner s = new Scanner(System.in);
System.out.println("Enter username");
String username = "";
usern = s.nextLine();
System.out.println("Enter password");
String password = "";
String pass = s.nextLine();
Statement stmt = conn.createStatement();
String SQL = "SELECT username,password FROM mytable WHERE username='" + usern + "' && password='" + pass + "'";
ResultSet rs = stmt.executeQuery(SQL);
while (rs.next()) {
username = rs.getString("username");
password = rs.getString("password");
}
if (usern.equals(username) && pass.equals(password)) {
System.out.println("Successful Login!\n----");
} else {
System.out.println("Incorrect Username or Password\n----");
validate = false;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} while (!validate);
}
我试过getter方法
public static String getusername(){return username;}
然后在另一个类中调用 Client.getusername() 方法后,Java 告诉我该字符串为空。我的代码中有两个用户名。其中之一称为usern。 usern 接受用户输入,而 username 用于从数据库中检索实际用户名。如果用户输入匹配检索到的username,则登录成功。我已将usern 声明为全局变量,正如您在我的代码中看到的那样,它是public static String usern;。使用常见的 Java 数据结构(如列表和集合)不起作用。有人可以帮帮我吗?我想避免每次用户打开聊天窗口时再次询问用户名。我没有Java经验,所以请放轻松。
【问题讨论】:
-
@Octavian 我将这行代码放在一个类方法中。我应该发布整个方法吗?
-
用户名和密码是方法 login() 的 2 个局部变量。你得到一个空值,因为你的“真实”用户名可能是一个全局变量,并且不是由 login() 加载的,
-
@Joe 这是我的“真实”用户名
-
如果您只有一个在 login() 中定义的用户名,那么“真实”用户名就是这个用户名,并且无法从外部访问。因此你得到了一个 NULL。
-
有两个用户名。其中之一称为
usern。usern接受用户输入,而username用于从数据库中检索实际用户名。如果用户输入匹配检索到的username,则登录成功。我已将usern声明为全局变量,正如您在我的代码中看到的那样,它是public static String usern;。 @Joe 如果我错过了重点,请帮助我理解。
标签: java