spring mvc controller class不能正常工作

时间:2015-08-04 05:29:08

标签: java spring spring-mvc hql

在我的项目中,我有一个包含电子邮件和密码字段的页面。 我的要求是,在填写用户名和密码字段后,当我按下提交时,它将检查数据库表中的用户名和密码字段。如果匹配则会转到配置文件页面。

所以,我这样做了:

mycontroller类是:

@RequestMapping(value = "/signin", method = RequestMethod.POST)
    public String dologin(@ModelAttribute("student") Student student,HttpServletRequest request,
            HttpServletResponse response,BindingResult result) {


          try{
           studentService.LoginStudent(student.getEmail(), student.getPassword());

                 if (result.hasErrors()) {
                  return "signin";
                }
              }
              catch(ConstraintViolationException e){

            }

        return "profile";
    }

我的StudentServiceimpl.java是:

public Student LoginStudent(String email, String password) {

        Student student = new Student(email,password);


        studentDao.LoginStudent(student);

        return student;
    }

和StudentDao.java是:

public void LoginStudent(Student student) {
       String hql = "select student_id from  student  where email = :email and password = :password";

        sessionFactory.getCurrentSession().createSQLQuery(hql)
        .setParameter("email", student.getEmail())
        .setParameter("password", student.getPassword());

    }

现在,问题是如果我把任何电子邮件ID和任何密码直接转到配置文件页面。如果字段为空,那么它也会转到配置文件页面。为什么它不检查字段?< / p>

3 个答案:

答案 0 :(得分:2)

我认为无论你使用result.hasErrors()做什么都不能很好地服务

我认为如果条件如下,我应该对待它:

 Student student =      studentService.LoginStudent(student.getEmail(), student.getPassword());




             if (student  != null) {
              return "signin";
            }

BindingResult类在这里不合适。它对表单验证很有用(通过验证方法)。

请阅读What is the use of BindingResult interface in spring MVC?

同样在您的hibernate代码中,您没有执行查询,请执行以下操作

Query query  = sessionFactory.getCurrentSession().createSQLQuery(hql)
        .setParameter("email", student.getEmail())
        .setParameter("password", student.getPassword());

return query.list();

以上程序仅供参考,您需要对代码进行额外的工作,如解析和所有。

答案 1 :(得分:0)

看你没有通过hql查询返回。 return true表示用户存在其他false。 你的控制器应该是这样的

 try {
    if (result.hasErrors()) {
        return "signin";
    }
    bool res = studentService.LoginStudent(student.getEmail(), student.getPassword());


    if (res) {
        return "profile";
    } else {
        return "sign_in";
    }
} catch (ConstraintViolationException e) {

}
return "profile";
}

答案 2 :(得分:0)

doLogin方法中的整个代码通常是错误的。

RequestMapping(value = "/signin", method = RequestMethod.POST)
public String dologin(@ModelAttribute("student") Student student, BindingResult result) {
    // No need for HttpServletRequest request and
    //   HttpServletResponse response
    String urlOrPage  = null;
    // First perform whether result has errors
    if(!result.hasErrors) {
        // If there are no errors, fetch Student
        Student student = studentService.loginStudent(student.getEmail(), student.getPassword());
        // If credentials are wrong, it will return null, if not, it will return Student. 
        if(student != null) {
            urlOrPage = "redirect:/profile";
        } else {
            urlOrPage = "signin";
        }

    } else {
        urlOrPage = "signin";
    }

    return urlOrPage;   
}

考虑到:

  • 您有“/ profile”映射
  • Student类中的验证注释已正确放置