読者です 読者をやめる 読者になる 読者になる

アラカン"BOKU"のITな日常

あれこれ興味をもって考えたことを書いてます

入力チェック:@Patternと正規表現で独自チェックする。STS 3.8.3(Spring Boot 1.5.1)+thymeleaf 

入力チェックに使える標準アノテーションがあります。こちらの記事でその一覧表とかも掲載しました。

arakan-pgm-ai.hatenablog.com

 

種類は色々あるのですが、個人的にサンプルプログラム以外で使っているのを調べてみたら、@NotNull、@Size、@Patternくらいしか使ってませんでした。

 

何故かというと、@Patternでアノテーションレベルで可能な大抵の入力チェックができてしまうからです。@Sizeはエラーメッセージに「3文字から6文字以内にしてください」みたいなmin,maxの指定値を埋め込みたいときくらいでした。

 

@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桁の数字とか英字を入力するとエラーになります。

f:id:arakan_no_boku:20170325113522j:plain

 

このパターンを覚えておけば、あとは正規表現文字列とエラーメッセージを変更していくと、いろんなチェックができます。

 

正規表現のサンプルはググれば、いっぱいでてきますが、@Patternで使う場合にちょっと注意しないといけない場合があります。

 

あくまで@Patternは、JAVAregexpと同じで、PerlSed正規表現例とかだとそのまま適用できない場合があります。あと例に「\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 1.5.1)+thymeleaf 関連記事

 

入力画面に関連する記事

画像をSUBMITボタン代わりに使う

ラジオボタンとラジオボタングループを使う 

ラジオボタンとラジオボタングループを使う 

チェックボックスを使う。 

HTMLのタグの閉じ忘れで例外が発生する!

プルダウンリストとマルチセレクトボックスを使う。

今度はテキストエリアで複数行入力する。 

テキストボックスの入力と基本的なチェックを使う。

 

参照画面・画面遷移に関連する記事

参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。 

参照画面:条件に一致した時のみHTML要素を出力する。

セッションを使って画面間で情報を受け渡す 

画面遷移:GET時のリクエストパラメータを受け取る 

日本語しか使わなくても、i18N対応はする意味がある。

 

入力チェックに関連する記事

入力チェック:未入力時に空文字が渡される仕様を回避する。 

入力チェック:@Patternと正規表現で独自チェックする。

入力チェック:アノテーション定義を自分で作る。(再利用版)

入力チェック用アノテーション定義を自分で作る。(独自実装版)

入力チェック:複数項目の相関チェックアノテーションの作り方

 

データアクセス・その他に関連する記事

データアクセス:Jprepositoryを使って簡単にCRUDする。 

データアクセス:ネイティブなSQL文を実行する 

クラスパス内の静的ファイルにアクセスする 

SpringBootだとログの書き出しも楽ちんです。 

SpringBootプロジェクトでJUNIT4を使った単体テストをする。

 

f:id:arakan_no_boku:20170404203859j:plain