2.4.2.1. バリデーションエラーのメッセージを画面表示する

サーバサイドで行ったバリデーションのエラーメッセージは、 HTTPエラー制御ハンドラ でリクエストスコープに格納される。 テンプレートエンジンでは、リクエストスコープに格納された ErrorMessages にアクセスすることでエラーメッセージを表示できる。 リクエストスコープの変数名は、エラーメッセージのリクエストスコープへの設定 を参照。

補足

JSPを使用した場合、 カスタムタグを使用したエラー表示 を使用することでエラーメッセージの表示ができるが、 カスタムタグが出力するDOM構造の制約によりCSSフレームワークとの相性が悪い問題がある。

リクエストスコープ上のオブジェクトを使用した場合、DOM構造の制約がなくなるためJSPでも直接リクエストスコープ上のオブジェクトにアクセスしエラーメッセージを表示しても良い。

以下に Thymeleaf を使った場合の実装例を示す。

特定のプロパティに対応したメッセージを表示したい

ErrorMessages#hasErrorErrorMessages#getMessage を使用することでプロパティ(入力項目のname属性の値)に対応したエラー有無やメッセージの表示ができる。

この例では、 form.userName プロパティに対応したエラーメッセージがリクエストスコープにある場合にメッセージが表示される。

<input type='text' name='form.txt' />
<span class="error" th:if="${errors.hasError('form.userName')}"
    th:text="${errors.getMessage('form.userName')}">入力してください。</span>
グローバルメッセージ(プロパティに紐付かないメッセージ)を表示したい

ErrorMessages#getGlobalMessages() を使用して グローバルメッセージが表示できる。

<ul>
  <li th:each="message : ${errors.globalMessages}" th:text="${message}"></li>
</ul>
全てのメッセージを表示したい

ErrorMessages#getAllMessages() を使用して 全てのメッセージが表示できる。

<ul>
  <li th:each="message : ${errors.allMessages}" th:text="${message}">エラーメッセージ</li>
</ul>