当前位置: 首页 > 知识库问答 >
问题:

如何通过模型从DAO获取数据并将其附加到视图[duplicate]

鲜于仰岳
2023-03-14

我是新来的Java,我试图实现一个登录系统和用户配置文件符合MVC-DAO。我想通过addUserDatatoView()方法使控制器能够从DAO检索用户凭据,以便将它们作为字符串添加到新的JPanel(view)中。无论如何,我不确定我的方法是否正确。首先,我得到了所有的时间NullPointerExc0019,事件虽然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)

如何通过Model(User类)从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;
    }
}

共有1个答案

董同
2023-03-14

从问题中的部分代码很难区分,但从我所看到的,只有在成功登录后才能构建用户对象。因此,构造函数应更改为:

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();
        }
    }
}
 类似资料:
  • main.java Controller/Controller.java 模型/ConnectDB.java 查看/fxmlSample.fxml 错误: 错误:(64,9)Java:类Sample.Controller.Controller中的method initData无法应用于给定类型;必需:javafx.event.actionevent找到:没有参数原因:实际和正式参数列表的长度不同

  • 问题内容: 我正在尝试创建一个自定义的视图,该视图可以让我获得数据库所有视图和表的行数。 在SQL Server中该死的表计数 现在,我需要获取VIEWS的行数 我觉得唯一的方法是从视图中计算行数,即 但是,我找不到一种方法来让视图的行数以及view_name,table_schema等。 在这方面的任何进步将是有帮助的。 问题答案: 这是最终的解决方案:

  • 我创建了一个名为的类来从firebase数据库中获取所有用户数据。下面是我用来获取firebase数据(用户名)的方法。 而firebase链接也没有问题。它还提供了用户名。 当我用一些虚拟的预定义字符串数据替换username时,这段代码就可以工作了。但是当我添加用户名时,它会给我以下错误。

  • 若要添加一个新的视图,点击工具栏的 “视图”按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的视图,简单地从模型选项卡拖放视图到画布。 【注意】如果你按住 Control 键并点按视图的连接器,你可以选择添加或删除顶点,以及更改它的颜色。 在画布中视图对象的弹出式菜单选项包括: 选项 描述 设计视图 在“视图设计器”中编辑视图结构。 添加关联的对象 添加全部关联的表或视图到选择的

  • 若要添加一个新的视图,点击工具栏的 “视图”按钮,并点击画布的任意位置。你可以从浏览器的模型选项卡添加一个现有的视图,简单地从模型选项卡拖放视图到画布。 【注意】如果你右击视图连接器,你可以选择添加或删除顶点,以及更改它的颜色,或者前往源视图和目标表。 在画布中视图对象的弹出式菜单选项包括: 选项 描述 设计视图 在“视图设计器”中编辑视图结构。 添加关联的对象 添加全部关联的表或视图到选择的视图

  • 问题内容: 我的页面上有一个通过URL调用spring控制器的页面。 现在,控制器看起来像 我发送的数据使用模式,并试图访问它的,但它显示为空白。 有什么方法可以在查看页面上接收该数据? 问题答案: 您必须为Spring Ajax调用示例添加@ResponseBody批注