5

登录表单:

<f:form class="form-horizontal" method="post" action="/login"
    commandName="logindata">
    <fieldset>
        <legend class="text-info">Login</legend>
        <div class="control-group">
            <f:label path="uname" class="control-label" for="uname">Username</f:label>
            <div class="controls">
                <f:input type="text" path="uname" name="uname" id="uname"
                    placeholder="Username" />
            </div>
        </div>
        <div class="control-group">
            <f:label path="pwd" class="control-label" for="pwd">Password</f:label>
            <div class="controls">
                <f:input type="password" path="pwd" name="pwd" id="pwd"
                    placeholder="Password" />
            </div>
        </div>
        <div class="control-group">
            <div class="controls">
                <button type="submit" class="btn" id="login">
                    Login <i class="icon-chevron-right"></i>
                </button>
            </div>
        </div>
        <div id="errormsg" class="alert alert-error">${message}</div>
    </fieldset>
</f:form>

loginData 类:

package com.demo.forms;

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

public class loginData {
    @Length(min=4)
    private String uname; 

    @NotEmpty
    private String pwd;

    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

用于显示和提交表单的控制器方法:(显示包含注册表单和登录表单的主页)

@RequestMapping(value = "/", method=RequestMethod.GET)
    public String showHome(Model model)
    {
        loginservice.logout();
        model.addAttribute("logindata", new loginData());
        model.addAttribute("signupdata", new signupData());
        return "home";
    }

提交登录表单时调用的方法:

@RequestMapping(value = "login", method=RequestMethod.POST)
    public String submitloginForm(@Valid loginData logindata, SessionStatus state, Model model, BindingResult result)
    {
            if((loginservice.loggedin()) || (result.hasErrors()))
            {
                return showHome(model);
            }
            else
            {
                String uname = logindata.getUname();
                String pwd = logindata.getPwd();
                if(loginservice.login(uname, pwd))
                {
                    model.addAttribute("user",uname);
                    return "redirect:profile";
                }
                else
                {
                    model.addAttribute("message","Invalid Username/Password");
                    return showHome(model);
                }   
            }   
    }


当输入的数据“有效”(正确或错误)时,登录工作正常。但是,当它无效时,例如密码字段为空或用户名长度少于四个字符时,将显示以下错误:

The request sent by the client was syntactically incorrect.

知道如何解决这个问题吗?

4

1 回答 1

37

您必须修改参数的顺序。始终将BindingResult result参数直接放在带有@Valid注释的参数之后。

@RequestMapping(value = "login", method=RequestMethod.POST)
public String submitloginForm(@Valid loginData logindata, BindingResult result,
                              SessionStatus state, Model model)

这甚至在本周春季的本周 - 2013 年 3 月 5 日博客条目中提到

前几天有人问我这个问题,我觉得值得一提:在您的 Spring MVC @Controller 类处理程序方法中,确保 BindingResult 参数紧跟在模型或命令参数之后,如下所示:@RequestMapping(. ..) 公共字符串句柄请求(@ModelAttribute @Valid YourCustomPojo 尝试,BindingResult 结果)。在此示例中,handleRequest 将验证 POJO (YourCustomPojo) - 检查 POJO 的 JSR303 注释并尝试应用约束,因为 POJO 使用 @Valid 注释 - 并将任何错误存储在 BindingResult 中,如果我们询问,它可以使用为了它。

春天会

  • 0) 确定处理方法
  • 1) 创建 loginData 的实例
  • 2)填充它
  • 3) 验证它,并将验证结果存储在 BindingResult
  • 4) 调用方法(使用 loginData 和 BindingResult 值),无论绑定 Result 是否包含错误
于 2013-03-11T17:31:00.540 回答