我在控制器类中遇到了一些问题。我有一个登录页面,第一次调用控制器时使用带有 GET 请求注释的方法。当表单发布时,它将使用带有 POST 请求注释的方法。
只有当表单发布时,我才想执行验证。所以验证检查放在 POST 方法(@Valid)中。我有一个@InitBinder 函数,但是当我发布表单时它不会被执行,因此验证类不会返回错误消息,'result.hasErrors()' 方法也不会被设置为 false。如果我将 @Valid 放在 GET 上,我会得到验证,这意味着 result.hasErrors() 被设置为 false。
我不确定@InitBinder 函数何时执行,或者如何只允许在 POST 的请求下执行。目前,当页面是 GET 时执行的唯一消息是“欢迎它是一个 get”,这就是我想要的,但是 POST 我得到了“错误!!!这是一个帖子'并且验证不会被执行。下面是一些代码:
控制器类中的代码
@InitBinder("login")
protected void initBinder(WebDataBinder binder){
binder.setValidator(new LoginValidation());
}
除了显示页面之外,我在 GET 中没有做任何事情
@RequestMapping(value="login.htm", method=RequestMethod.GET)
public ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response,Model model, @ModelAttribute("login") Login login,BindingResult result )
throws ServletException {
return new ModelAndView("login","errorMsg", "Welcome it was a get");
}
@RequestMapping(value="login.htm", method=RequestMethod.POST)
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response, @Valid @ModelAttribute Login login, BindingResult result, ModelMap m) throws Exception {
if(result.hasErrors()){
return new ModelAndView("login", "errorMsg", "Errors was detected");
}else{
if (authenticationManager.Authenticate(login) == true){
return new ModelAndView("main","welcomeMessage", message);
}
return new ModelAndView("login","errorMsg", "Error!!! It was a post");
}