Springには入力チェックに使える標準アノテーションが用意されています。
STS3(3.9.6)+SpringBoot2.0+Tymeleaf3.0迄動作確認しています。
意外に種類は使わない
標準アノテーションの種類は色々あるのですが、個人的に使っているのを調べてみたら、@NotNull、@Size、@Patternくらいしか使ってませんでした。
しかも、@Sizeはエラーメッセージに「3文字から6文字以内にしてください」みたいなmin,maxの指定値を埋め込みたいときくらいで、ほぼ、 @Patternでしたね。
何故かというと、@Patternで正規表現を使って入力チェックすると、アノテーションレベルで可能な大抵の入力チェックが、それでできてしまうからです。
今回は、@Patternに絞って書いてみます。
なお。
正規表現そのものについては、ここでは説明せず、まとめていただいているサイトを紹介しておきます。
とりあえず、必要最低限を知りたい場合は、こちら。
詳しく知りたい場合は こちらを、個人的にはおすすめします。
@Patternの使い方をおさらいしておきます
まず、Formクラスで指定します。
今回は、chktestという項目につけています。
(regexpのパターンの説明はあとでします)
@Pattern(regexp = "^\\d{5,10}$")
private String chktest;public String getChktest() {
return chktest;
}public void setChktest(String chktest) {
this.chktest = chktest;
}
続けて、エラーメッセージを/src/main/resources/messages.propertiesに指定します。
Pattern.chktest のように、PatternにFormの変数名をつけることで、専用エラーメッセージにできます。
Pattern.chktest={0}がパターン({2})の通りに入力されていません
この{0}には変数名(例では chktest)がはいります。
{2}には指定したパターン文字列(例では^\\d{5,10}$)がはいります。
入力する部分とエラーメッセージを表示するHTMLです。
FormとSubmitボタン部もついでにつけてます。
<form role="form" action="/outpg01" th:action="@{/outpg01}" th:object="${hello3Form}" method="post">
<p class="msg" th:text="#{please.chktest}">Please input PID</p>
<input type="text" id="chktest" name="chktest" th:field="*{chktest}" />
<span class="error_msg" th:if="${#fields.hasErrors('chktest')}" th:errors="*{chktest}">error!</span>
<br /><button type="submit">実行</button>
</form>
これで、テキストボックスを表示して、エラーになる入力をしてみます。
^\\d{5,10}$ は、「5桁から10桁の数字のみにマッチ」ですから、4桁の数字とか英字を入力するとエラーになります。
このパターンを覚えておけば、あとは正規表現文字列とエラーメッセージを変更していくと、いろんなチェックができます。
正規表現のサンプルはググれば、いっぱいでてきますが、@Patternで使う場合にちょっと注意しないといけない場合があります。
あくまで@Patternは、JAVAのregexpと同じで、PerlやSedの正規表現例とかだとそのまま適用できない場合があります。
あと例に「\d:数字にマッチする」と書かれているのを、そのまま書くとエラーになります。
JAVAの規則に従って「\\d」のように\をエスケープ(\\と書く)しなければいけません。
いくつか正規表現の例をあげておきます
日付
和暦と西暦の両方を許して、例えば 3/32のような日付としてはありえない入力もエラーにするようなパターン
@Pattern(regexp = "^([MTSH]\\d{1,2}|\\d{2,4})/?(0?[1-9]|1[0-2])/?(0?[1-9]|[1-2][0-9]|3[0-1])$")
URL
@Pattern(regexp = "^(https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)$")
メールアドレス
@Pattern(regexp = "^([\\w])+([\\w\\._-])*\\@([\\w])+([\\w\\._-])*\\.([a-zA-Z])+$")
郵便番号(7桁-付きと-なしの両方を許すパターン)
@Pattern(regexp = "^\\d{3}\\-?\\d{4}$")
こんな感じで、持ちネタを増やしていくといいと思います。
とは言え、これが便利なのは単発利用です。「数が増えると大変だな・・・」と感じるのが普通でしょう。
当然、そこを回避する方法はあります。
その方法は、次回の記事で紹介したいと思います。
STS 3.8.3+Spring Boot+thymeleaf 関連記事
入力画面に関連する記事
参照画面・画面遷移に関連する記事
参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。
入力チェックに関連する記事
入力チェック:@Patternと正規表現で独自チェックする。
入力チェック用アノテーション定義を自分で作る。(独自実装版)
データアクセス・その他に関連する記事