JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
Spring-MVCの散歩道 > SpringMVC の小径 > 第7歩 Spring-MVC 迷いの一歩 > 入力チェック

package jp.dip.arimodoki.cntl;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import jp.dip.arimodoki.model.PromenadeFormIf;

@Controller    //このクラスはコントローラです。
public class Promenade {
    /**
     * このコントローラは、PromenadeFormクラスを
     * リクエスト/レスポンス用パラメータのデータモデルとして使います
     * */
    @Autowired            //ここでPromenadeFormを、DIしてインスタンスを生成しておきます
    private PromenadeFormIf PromenadeForm;    //DIする変数の型は、クラスではなくインターフェースとします

    /**
     * PromenadeFormクラスを、"PromenadeFormData"という名前で、Modelにバインドします。
     * この処理を行うことで、viewにレスポンスする場合は
     * 特にレスポンス処理を明記しなくても、自動的にModelがviewに返却され
     * view側(Thymeleaf側)では、PromenadeFormData.プロパティ名 
     * でFormBeanのプロパティが参照可能となります。
     * ※)@ModelAttributeアノテーションのバインド名が重要であって、
     *   メソッド名はなんでも構いません(クラス内で重複しなければ)
     * @return バインドされたFormBeanのインターフェース PromenadeFormIfを返します。
     */
    @ModelAttribute("PromenadeFormData")
    private PromenadeFormIf setupBind() {
        return this.PromenadeForm;
    }

    /**
     * 最初の入力画面を単純に表示するためだけのメソッドです
     * @return view名(入力画面)
     */
    @RequestMapping(value = "/promenade")
    public String promenade() {
        return "promenade";        //入力画面
    }

    /**
     * 入力結果検証メソッド
     * @param formbean 入力検証用FormBean
     * @param result エラー検証結果
     * @return view名(検証成功なら結果画面、失敗なら入力画面)
     */
    @RequestMapping(value = "/promenaderes")
    public String promenaderes(
        @Valid @ModelAttribute("PromenadeFormData") PromenadeFormIf formbean,
        BindingResult result
        ) {

        //特定の年齢はNGとするような論理チェックを行う
        FieldError perror = result.getFieldError("age");
        int age = formbean.getUser().getAge();    //入力された年齢を取得
        if(perror == null) {    //年齢の入力検証自体は正常
            if(age >=50 && age < 60) {	//50歳以上60歳未満はNGとする
                result.rejectValue("age","out of Range","50歳以上60歳未満は入力できません。");
            }
        }

        //入力妥当性チェック結果 hashになんか入ってるのでエラーが出ているよ!
        if (result.hasErrors()) {
            //入力エラーがあったら入力画面にエラー情報を表示
            return "promenade";    //入力画面のviewを表示
        }

        //①チェックボックスのチェック内容を結果表示用のプロパティにコピー
        String[] checkVal = this.PromenadeForm.getCheckVals();
        //ValidationCheckが正常に通っていれば checkValは、必ず1個入っている
        formbean.setFavorite(checkVal[0]);    //checkValをお気に入りにコピー⇒結果画面描画用
        //①チェックボックスのチェック内容を結果表示用のプロパティにコピー

        return "promenaderes";        //入力妥当性チェックに成功したら、結果画面
    }
}