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);
                }   
            }   
    }


入力されたデータが「有効」(正しいか間違っているか)の場合、ログインは正常に機能します。ただし、パスワードフィールドが空の場合やユーザー名の長さが4文字未満の場合など、無効な場合は、次のエラーが表示されます。

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日ブログエントリ

先日誰かが私にこれを尋ねましたが、言及する価値があると感じました。SpringMVC @Controllerクラスハンドラーメソッドで、BindingResult引数がモデルまたはコマンド引数の直後にあることを確認してください:@RequestMapping(。 ..)public String handleRequest(@ModelAttribute @Valid YourCustomPojo try、BindingResult result)。この例では、handleRequestはPOJO(YourCustomPojo)を検証し(POJOにJSR303アノテーションがないかチェックし、POJOには@Validがアノテーションされているため、制約を適用しようとします)、BindingResultにエラーを隠します。それのための。

春は

  • 0)ハンドラーメソッドを決定します
  • 1)loginDataのインスタンスを作成します
  • 2)データを入力します
  • 3)それを検証し、検証結果をBindingResultに保存します
  • 4)バインディング結果にエラーが含まれているかどうかに関係なく、メソッドを(loginData値とBindingResult値を使用して)呼び出します
于 2013-03-11T17:31:00.540 に答える