SpringMVCでバリデーションチェックを実施します。
例として、作業時間入力用のクラスがあるとして、それを複数所持するListがあるとし、
JSPでそのListをループし、作業時間入力レコードを複数表示およびチェックします。
-
バリデーションチェックのjarファイル追加
「【SpringMVC設定】ファイルその4」を参考にpom.xmlにjarファイルを追加する。
-
アノテーション追加
作業時間入力用のクラスは全て必須項目とするため、「@NotNull」を追加する。1
public
class
DayTimeWork
implements
Serializable {
2
private
static
final
long
serialVersionUID = 1L;
3
4
@NotNull
5
private
String ankenNo;
6
@NotNull
7
private
String startTime;
8
@NotNull
9
private
String endTime;
10
11
アクセサメソッドは省略。
12
}
作業時間入力用のクラスを保持するListには「@Valid」を追加する。
「@Valid」はネストしたクラスも検証対象とする場合、追加します。1
public
class
DayTime
implements
Serializable {
2
@Valid
3
private
List<DayTimeWork> dayTimeWork;
4
5
アクセサメソッドは省略。
6
}
-
コントローラーへの設定追加
Javaコントローラーにバリデーションチェックを実施するための設定を追加する。
「@Validated」の次の項目にBindingResultを記載しないと
実行時にValidationExceptionが発生する。1
@Controller
2
public
class
InputController {
3
4
@InitBinder
5
public
void
initBinder(WebDataBinder binder) {
6
// bind empty strings as null
7
binder.registerCustomEditor(String.
class
,
new
StringTrimmerEditor(
true
));
8
}
9
10
@RequestMapping
(value =
"/updateDayTime"
, method = RequestMethod.POST)
11
public
String updateDayTime(
12
@ModelAttribute
(value =
"dayTime"
) DayTime dayTime,
13
final
@Validated
DayTime inputDayTime,
14
BindingResult result,
15
Model model) {
16
// 処理省略
17
}
18
}
-
JSPへの設定追加
JSPでバリデーションチェック結果を取得する。
Thymeleafのタグを利用し、全項目内でエラーが1つでもあれば、
変数errとしてエラーを取得し、表示しています。1
<
form
class
=
"form-horizontal"
action
=
"#"
th:action
=
"@{/updateDayTime}"
th:object
=
"${dayTime}"
method
=
"post"
>
2
<
fieldset
>
3
<
ul
th:if
=
"${#fields.hasErrors('*')}"
>
4
<
li
th:each
=
"err : ${#fields.errors('*')}"
th:text
=
"${err}"
>Input is incorrect</
li
>
5
</
ul
>
6
</
fieldset
>
7
</
form
>
Thymeleafのタグを利用し、エラー項目のテキストボックスの枠を赤くしたり、
入力がない場合、placeholderで「案件番号」という文字を初期表示することも可能。1
<
form
class
=
"form-horizontal"
action
=
"#"
th:action
=
"@{/updateDayTime}"
th:object
=
"${dayTime}"
method
=
"post"
>
2
<
table
class
=
"table"
>
3
<!-- 処理省略 -->
4
<
tr
th:each
=
"vc, row : *{dayTimeWork}"
>
5
<
td
th:class
=
"${#fields.hasErrors('dayTimeWork[__${row.index}__].ankenNo')}? has-error"
align
=
"center"
>
6
<
input
type
=
"text"
th:field
=
"*{dayTimeWork[__${row.index}__].ankenNo}"
placeholder
=
"案件番号"
class
=
"form-control"
/>
7
</
td
>
8
</
tr
>
9
</
table
>
10
</
form
>