代码之家  ›  专栏  ›  技术社区  ›  Franz Biberkopf

Java:如何通过模型从DAO获取数据并将其附加到视图中

  •  0
  • Franz Biberkopf  · 技术社区  · 3 年前

    我是Java新手,我正在尝试实现一个符合MVC-DAO的登录系统和用户配置文件。我希望通过addUserDatatoView()方法使控制器能够从DAO检索用户凭据,以便将它们作为字符串添加到新的JPanel(视图)中。无论如何,我不确定我的方式是否正确。首先,我一直在获取NullPointerException事件,尽管DAO级别正确地从数据库获取数据:

    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;
        }
    }
    
    0 回复  |  直到 3 年前
        1
  •  1
  •   c0der    3 年前

    从问题中的部分代码很难判断,但从我看到的情况来看 User 只有在成功登录后才能构造对象。因此,构造函数应改为:

    public LoginController(LoginView view) {
        this.view = view;
        addListener();
    }
    

    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 {
                user = myDAO.getUserLogIn(name, pass);//change getUserLogIn to return a single User, or null 
                //when method from DAOImpl get filled, proceed to Home
                if(user != null) {                
                    showHome();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
    }