我希望有一个使用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页面传递用户名作为session.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 session get(Class clazz,Serializable id)抛出HibernateException方法,但我不知道我做错了什么。
答案 0 :(得分:0)
whitelist
正在寻找id(主键)作为session1.get(Users.class,userName);
参数。您可以更改表格,以便用户名是主键,或者创建一个执行选择以通过用户名查找ID的dao。
答案 1 :(得分:0)
session.get需要一个pk。另外检查你的参数\表单变量,它们似乎不一致。 试试hibernate的这个语法:
user = session.createCriteria(Users.class,&#34; user&#34;) 。新增(Restriction.eq(&#34; user.username&#34;,用户名))。uniqueResult();
答案 2 :(得分:0)
您的HTML文件中有一个错误。您必须将方法发布为method =“ post”
request.getParameter()方法仅适用于String数据类型。
在Hibernate中,可以通过session.get(Employee.class,Id)方法从数据库中获取数据,并且仅当我们将第二个参数指定为Interger时,该方法才有效。
相反,您可以使用我的抽象代码:
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>
login.jsp的抽象代码。这里的login.jsp页面用于存储Bean对象以与您的html文件和Java pojo类进行映射。
<% 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;
}
}