有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用hibernate检索用户名和密码的java登录

我想有一个使用hibernate从mySQL数据库检索用户名和密码的登录页面

我的代码如下 对于我的HTML页面,我有一个使用get方法的表单

form action="PlaylistServlet" method="get">
<input type = "text" name ="userId" placeholder="userName">
<input type="password" name="password" placeholder="Password">
<input type="submit" value="submit">
</form>

下面是我的servlet doGet方法,它将数据从HTML页面传递到服务类,并在用户名和密码对正确的情况下重定向回登录页面

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    Users user1 = new Users();
    String userName = request.getParameter("userName");
    String password = request.getParameter("password");
    SetData sd = new SetData();
    Users us = sd.get(userName); //get method in service class. Line 38
    String passwordDB = us.getPassword();// line 39
    if (user1.checkPassword(password, passwordDB)) {
        response.sendRedirect("UserLogin.html");
    }
}

下面是我的服务类get方法,它使用hibernate会话从mySQL数据库检索数据。我从HTML页面传入用户名作为会话的主键。get()方法

public Users get(String userName) {

    Users us = null;
    SessionFactory sf = null;
    Session session1 = null;
    try {
        sf = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
        session1 = sf.openSession();
        Transaction tx = session1.beginTransaction();

        us = (Users) session1.get(Users.class,userName); // line 64
        tx.commit();
        session1.close();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        sf.close();
    }
    return us;

}

最后,在运行代码之后,我得到了下面的错误消息

java.lang.IllegalArgumentException: id to load is required for loading
at com.marv.service.SetData.get(SetData.java:64)
at com.marv.service.PlaylistServlet.doGet(PlaylistServlet.java:38)

java.lang.NullPointerException
at com.marv.service.PlaylistServlet.doGet(PlaylistServlet.java:39)

我认为我的问题在于hibernate会话get(Class clazz,Serializable id)抛出HibernateException方法,但我不知道我做错了什么


共 (3) 个答案

  1. # 1 楼答案

    session1.get(Users.class,userName);
    

    正在查找id(主键)作为userName参数。您可以更改表,使用户名成为主键,也可以创建一个dao,该dao执行select以按用户名查找id

  2. # 2 楼答案

    会议。get需要一个pk。还要检查您的参数\表单变量,它们似乎不一致。 请为hibernate尝试以下语法:

    用户=会话。createCriteria(Users.class,“user”) .add(Restriction.eq(“user.username”,username))。uniqueResult()

  3. # 3 楼答案

    HTML文件中有一个错误。您必须以method=“post”的形式发布该方法

    方法请求。getParameter()仅适用于字符串数据类型

    在Hibernate中,可以通过会话从数据库中获取数据。get(Employee.class,Id)方法,并且只有当我们将第二个参数指定为integer时,此方法才有效

    相反,您可以使用我的抽象代码:

    HTML代码

    form action="login.jsp" method="post">
    <input type="text" name="empId" required>
    <input type = "text" name ="userName" placeholder="userName">
    <input type="password" name="passWord" placeholder="Password">
    <input type="submit" value="submit">
    </form>
    

    登录的抽象代码。jsp。在这里登录。jsp页面,用于存储要与html文件和JavaPOJO类映射的bean对象

    <% String path1 = "/LoginServlet";%>
    
        <jsp:useBean id="login" class="com.bean.Employee" scope="session">
            <jsp:setProperty name="login" param="empId" property="empId" />
            <jsp:setProperty name="login" param="userName" property="userName" />
            <jsp:setProperty name="login" param="passWord" property="passWord" />
        </jsp:useBean>
    
        <jsp:forward page="<%=path1 %>" />
    

    登录Servlet代码:

    @WebServlet("/LoginServlet")
    public class LoginServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
                PrintWriter out = response.getWriter();
                HttpSession session = request.getSession();
    
                Employee emp = (Employee)session.getAttribute("login");
    
                LoginDAO login = new LoginDAO();
    
                boolean flag = login.login(emp);
    
                if(flag == true)
                {
                    out.print("Employee Login Successfully !!!");
                }
                else
                {
                    out.print("Incorrect Username or Password !!!");
                }
    
        }
    
    }
    

    登录DAO代码:

        public boolean login(Employee emp)
        {
    
            SessionFactory sf = new Configuration().configure().buildSessionFactory();
            Session session = sf.openSession();
    
            Transaction tx = session.beginTransaction();
    
            Employee employeeDatafromDB = (Employee)session.get(Employee.class,emp.getEmpId());
    
    
            boolean key = false;
    
            if(emp.getUserName().equals(employeeDatafromDB.getUserName()) && emp.getPassWord().equals(employeeDatafromDB.getPassWord()))
            {
                System.out.println("Employee Login Successfully !!!");
                return key = true;
            }
            else
            {
                System.out.println("Incorrect Username or Password !!!");
                return key = false;
            }
    
        }