如何在 Servlet 中使用 DAO 设计模式方法将用户输入存储到 MongoDB?

Posted

技术标签:

【中文标题】如何在 Servlet 中使用 DAO 设计模式方法将用户输入存储到 MongoDB?【英文标题】:How to use DAO design pattern appoarch in Servlets to store user input to MongoDB? 【发布时间】:2021-01-10 17:48:30 【问题描述】:

我尝试在 Servlet 上使用 DAO 设计模式将用户输入存储到 MongoDB。虽然在这个post 和这个post 上找到了一些有用的提示。毫无疑问,我得到了 NullpointException。我想知道是因为我没有创建集合和文档来在DaoImpl 上的方法中“插入”用户输入,或者我不明白如何在 Servlet 和 DaoImpl 类之间工作

这里是 UserDAO

public interface UserDao 
    List<User> getAllUsers();    
    void save(User user);    
    void updateUer(User user);    
    void deleteUser(User user);    

DaoImpl,我认为是导致NullPointException 并想修复它并怀疑这里是否连接到数据库。

公共类 UserDaoImpl 实现 UserDao

    @Override
    public void save(User user) 
        if (user == null) 
            System.out.println("not working!!!!!!!");
         else 
            user.setName(user.getName());
            user.setEmail(user.getEmail());
            user.setPassword(user.getPassword());
        
        // connection the db in here or in the Servlets controller?
    

Servlet 控制器

public class RegisterServlet extends HttpServlet 
private UserDao userDao;
private User user;

public RegisterServlet(User user) 
this.user = user;


public RegisterServlet(UserDao userDao) 
this.userDao = userDao;

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

// Collect to database
MongoDatabase mdb = dBUtils.getMongoDB();    
assert mdb != null;

MongoCollection<Document> collection = mdb.getCollection("Users");

userDao.save(user);

错误消息

Type Exception Report    
Description The server encountered an unexpected condition that prevented it from fulfilling the request.    
Exception    
java.lang.NullPointerException
    uts.asd.controller.RegisterServlet.doPost(RegisterServlet.java:54)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note The full stack trace of the root cause is available in the server logs.

【问题讨论】:

userDao 对象是在哪里创建的?另外,从异常中,你能告诉你在哪一行得到 NPE。 我在 Servlet 上声明了它。我应该把它放在 Save 方法中来完成所有任务吗?恐怕我得到的只是错误信息。 你忘了告诉你到底哪个变量是null,以及你为什么期望它不是null。根据您目前的问题,它基本上是***.com/q/218384 的副本,您不希望这样。换句话说,解决你的问题,问为什么变量 X null 是(同时清楚地指出它在你的代码 sn-p 中到底是哪个变量以及它是如何创建的)而不是问为什么你会得到 NullPointerException。跨度> 我将在今天晚些时候尝试纠正我的问题,以找出导致此异常的原因,谢谢。 【参考方案1】:

我调查并遵循了这个post的建议,终于可以将数据存储到MongoDB了。

这就是我所做的,

UserDaoImpl 类中的 SaveUser 方法

    @Override
    public void save(User user) 

// this what I want to see. user is saved to db here
        try 
            MongoDatabase mdb = dBUtils.getMongoDB();
            assert mdb != null;

            if (user == null) 
                System.out.println("not working!!!!!!!");
             else 

                users.add(new Document("Email", user.getEmail()).
                        append("Password", user.getPassword())
                        .append("Name", user.getName()));
                MongoCollection<Document> userlist = mdb.getCollection("Users"); //Create or get a collection "users" on mLab
                userlist.insertMany(users);

            
         catch (Exception e) 
            e.printStackTrace();
        
    

Servlet 类

public class RegisterServlet extends HttpServlet 

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

        User user = new User();
        UserDaoImpl userDao = new UserDaoImpl();

        user.setName(request.getParameter("name"));
        user.setEmail(request.getParameter("email"));
        user.setPassword(request.getParameter("password"));

        userDao.save(user);

        request.getRequestDispatcher("/welcome.jsp").forward(request, response);
    

【讨论】:

以上是关于如何在 Servlet 中使用 DAO 设计模式方法将用户输入存储到 MongoDB?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 servlet 中调用 DAO 方法来提取查询结果

JSP+Servlet+DAO+Javabean模式小记-20171029

在MVC开发模式下DTO,DAO,Servlet,Jsp的作用?

java中如何调用DAO

如何将dao注入到servlet中?

带有 Servlet、JSP 和 MySQL 的 Java 中的 CRUD Web 应用程序,没有 DAO