登录按钮点击后跳转至代理信息表单的实现问题求助
问题:登录验证通过后无法跳转至代理信息表单并显示信息
我希望点击登录按钮后打开代理信息表单,但目前无法实现。我有一张名为agent的表,包含User_Name、Password、First_Name和Last_Name字段。我获取用户输入的User_Name和Password进行登录验证,验证通过后需跳转至代理信息表单并显示信息。以下是我的登录按钮事件处理代码:
private void jButton1_LogInActionPerformed(java.awt.event.ActionEvent evt) { Connection con = MyConnection.getConnection(); PreparedStatement ps; try { ps=con.prepareStatement("Select * from agent WHERE User_Name = ? AND Password = ?"); ps.setString(1, jTextField1_UserName.getText()); ps.setString(2, String.valueOf(jPasswordField1.getPassword())); ResultSet rs = ps.executeQuery(); String Name = jTextField1_UserName.getText(); if(rs.next()) { String First_Name = rs.getString("First_Name"); if(Name.equals(First_Name)) { Agent_Info ag_info = new Agent_Info(); ag_info.setVisible(true); ag_info.pack(); ag_info.setLocationRelativeTo(null); this.dispose(); //System.out.println("Yes"); } } } catch (SQLException ex) { Logger.getLogger(LoginForm.class.getName()).log(Level.SEVERE, null, ex); }
请问如何完成该任务?
解决方案
我来帮你梳理问题并给出修复方案:
1. 找到核心问题:多余的错误判断
你代码里的关键问题在于,登录验证成功(rs.next()返回true)后,又加了一个if(Name.equals(First_Name))的判断——这完全是画蛇添足,而且逻辑错误!User_Name是用户登录用的账号,First_Name是用户的名字,这两个字段本来就不是同一个概念,除非你的所有用户的账号和名字完全一致,否则这个判断永远不会成立,自然也就跳不到代理信息表单。
2. 分步修复实现需求
步骤一:简化登录验证逻辑
直接去掉那个多余的判断,只要数据库查询到匹配的用户(rs.next()为true),就说明登录成功,直接跳转并传递用户信息:
if(rs.next()) { // 从结果集里取出代理的所有信息 String userName = rs.getString("User_Name"); String firstName = rs.getString("First_Name"); String lastName = rs.getString("Last_Name"); // 创建代理信息表单实例,把数据传过去 Agent_Info ag_info = new Agent_Info(userName, firstName, lastName); ag_info.setVisible(true); ag_info.pack(); ag_info.setLocationRelativeTo(null); this.dispose(); } else { // 可以在这里添加登录失败的提示,比如弹出对话框 JOptionPane.showMessageDialog(this, "用户名或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE); }
步骤二:修改Agent_Info类,接收并展示数据
你需要给Agent_Info添加一个带参数的构造方法,用来接收登录成功后的用户信息,然后把这些信息显示在窗口里。比如假设你的Agent_Info里有三个文本框用来展示信息:
public class Agent_Info extends JFrame { private JTextField tfUserName; private JTextField tfFirstName; private JTextField tfLastName; // 带参数的构造方法,接收登录用户的信息 public Agent_Info(String userName, String firstName, String lastName) { initComponents(); // 假设这是你初始化窗口组件的方法 // 把数据设置到对应的组件上 tfUserName.setText(userName); tfFirstName.setText(firstName); tfLastName.setText(lastName); } // 其他窗口初始化、事件处理代码... }
步骤三:补充资源关闭的最佳实践
为了避免数据库连接泄漏,建议使用try-with-resources语法,自动关闭Connection、PreparedStatement和ResultSet:
private void jButton1_LogInActionPerformed(java.awt.event.ActionEvent evt) { // try-with-resources会自动关闭括号内的资源 try (Connection con = MyConnection.getConnection(); PreparedStatement ps = con.prepareStatement("Select * from agent WHERE User_Name = ? AND Password = ?")) { ps.setString(1, jTextField1_UserName.getText()); ps.setString(2, String.valueOf(jPasswordField1.getPassword())); try(ResultSet rs = ps.executeQuery()){ if(rs.next()) { String userName = rs.getString("User_Name"); String firstName = rs.getString("First_Name"); String lastName = rs.getString("Last_Name"); Agent_Info ag_info = new Agent_Info(userName, firstName, lastName); ag_info.setVisible(true); ag_info.pack(); ag_info.setLocationRelativeTo(null); this.dispose(); } else { JOptionPane.showMessageDialog(this, "用户名或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE); } } } catch (SQLException ex) { Logger.getLogger(LoginForm.class.getName()).log(Level.SEVERE, null, ex); JOptionPane.showMessageDialog(this, "数据库连接异常,请重试", "错误", JOptionPane.ERROR_MESSAGE); } }
3. 额外的安全与代码规范建议
- 永远不要明文存储密码:现在你的代码直接把密码存在数据库里,这是非常危险的做法。建议使用BCrypt等哈希算法,存储密码的哈希值,验证时对用户输入的密码做哈希后再和数据库里的值对比。
- 给组件起有意义的名字:比如把
jButton1改成btnLogin,jTextField1_UserName改成tfUserName,这样代码可读性会提升很多。
内容的提问来源于stack exchange,提问作者Rahat Batool
相关产品推荐
相关产品推荐

