【发布时间】:2022-01-16 11:26:21
【问题描述】:
我是 Java 新手,我正在尝试实现登录系统和符合 MVC - DAO 的用户配置文件。我想通过方法 addUserDatatoView() 启用控制器以从 DAO 检索用户凭据,以便将它们作为字符串添加到新的 JPanel(视图)中。无论如何,我不确定我的前进方式是否正确。首先,尽管 DAO 级别从数据库中正确获取数据,但我一直收到 NullPointerException 事件:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "model.User.getUserName()" because "this.user" is null
at controller.LoginController.addUserDatatoView(LoginController.java:75)
at controller.LoginController.showHome(LoginController.java:65)
at controller.LoginController$LoginListener.actionPerformed(LoginController.java:44)
如何通过模型(用户类)从 DAO 中实际检索数据?将数据作为字符串从控制器部署到视图的最佳方式是什么?
我很困惑不同类之间的通信以及正确的程序是什么,以免违反 MVC-DAO。
我不是要你解决问题,而是要得到一个提示,以便找到正确的方向。
DAO 实现:
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import controller.HomeController;
import ds.OracleDsSingleton;
import model.Event;
import model.User;
import view.HomeView;
import view.LoginView;
import view.ProfileView;
public class DaoImpl implements DAO {
LoginView view;
ProfileView profView;
ResultSet rs;
public DaoImpl(LoginView view, ProfileView profView) {
this.view = view;
this.profView = profView;
}
@Override
public ArrayList<User> getUserLogIn (String userName, String userPass) throws SQLException {
OracleDsSingleton ora = OracleDsSingleton.getInstance();
boolean controlRecords = false;
try {
//ArrayList type User
ArrayList<User> user = new ArrayList<User>();
Connection con = ora.getConnection();
Statement stmt = con.createStatement();
String addQuery = "SELECT * FROM UserList";
ResultSet rs = stmt.executeQuery(addQuery);
while (rs.next()) {
userName = rs.getString("userName");
userPass = rs.getString("userPass");
if (userName.equals(view.getUserNameTextField().getText().toString())
&& (userPass.equals(view.getUserPassTextField().getText().toString()))) {
{
controlRecords = true;
User u = new User(userName, userPass);
user.add(u);
for(User us : user) {
System.out.println("Directly from DAOImp: " + us);
}
return user;
}
}
else {
continue;
}
}
if (!controlRecords) {
JOptionPane.showMessageDialog(null, "Not successfully logged in!");
};
if (con != null)
con.close();
if (stmt != null)
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
班级用户:
public class User {
String userName;
String userPass;
public User(String userName, String userPass) {
this.userName = userName;
this.userPass = userPass;
}
public User() throws SQLException {
}
public String getUserName() {
return userName;
}
public String getUserPass() {
return userPass;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String toString() {
return userName + userPass;
}
}
控制器
package controller;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JComponent;
import controller.LoginController.LoginBACKListener;
import dao.DAO;
import dao.DaoImpl;
import model.User;
import view.HomeView;
import view.LoginView;
import view.ProfileView;
import view.StartView;
public class LoginController{
private User user;
private LoginView view;
private ProfileView profView;
public LoginController(User user, LoginView view) {
this.user = user;
this.view = view;
addListener();
}
private void addListener() {
this.view.setLoginListener(new LoginListener());
}
class LoginListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String name = view.getUserNameTextField().getText();
String pass = view.getUserPassTextField().getText();
DAO myDAO = new DaoImpl(view, profView);
try {
//when method from DAOImpl get filled, proceed to Home
if(myDAO.getUserLogIn(name, pass) != null) {
showHome();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
public void showHome() {
HomeView home = new HomeView();
home.setVisible(true);
HomeController h = new HomeController(home);
try {
addUserDatatoView();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ArrayList<User> addUserDatatoView() throws SQLException {
DAO myDAO = new DaoImpl(view, profView);
ArrayList<User> userCredentials = myDAO.getUserLogIn(user.getUserName(), user.getUserPass());
for(User us : userCredentials) {
System.out.println("Directly from Controller: " + us);
}
return userCredentials;
}
}
【问题讨论】:
-
请edit 您的问题并标记引发异常的行(LoginController 第 75 行)。我猜这个异常是因为
user在myDAO.getUserLogIn(user.getUserName()中为空。如果是这样,似乎LoginController被初始化为一个空值(new LoginController(null, view))。如需更多帮助,请发帖minimal reproducible example -
基本上,您希望控制器成为中心点并协调整个事情:从
view获取用户详细信息,使用dao进行验证(dao应该独立于视图。它不应该有对视图的引用)并根据验证的结果更新视图。
标签: java swing model-view-controller dao