SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

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

Springには入力チェックに使える標準アノテーションが用意されています。 

STS3(3.9.6)+SpringBoot2.0+Tymeleaf3.0迄動作確認しています。

f:id:arakan_no_boku:20190222012501j:plain

 

意外に種類は使わない

 

標準アノテーションの種類は色々あるのですが、個人的に使っているのを調べてみたら、@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桁の数字とか英字を入力するとエラーになります。

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+thymeleaf 関連記事 

入力画面に関連する記事

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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