メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

Struts2のメッセージを独自カスタマイズして表示する

バージョンと設定

Struts 2.3.24.1
struts.xml での struts.enable.DynamicMethodInvocation は true

Struts2のメッセージ表示は

<s:fielderror />
<s:actionerror />
<s:actionmessage />
のタグがありますが、一気に表示されてしまうのと
theme="simple"といえど<LI>タグなどは出てしまい不要で、
完全にシンプルとはいえない。。

こちとらループで1つずつメッセージを処理するような形で
デザインしていきたいのです。

カスタマイズしてレンダリングする

Bootstrapのalert-dangerに埋めるなら

<!-- Error message -->
<s:if test="hasActionErrors() || hasFieldErrors()">
  <div class="alert alert-danger alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
    <s:iterator var="actionError" value="actionErrors">
      <strong>Error!</strong> ${actionError}<br>
    </s:iterator>
    <s:iterator var="entry" value="%{fieldErrors.entrySet()}">
      <s:iterator var="val" value="%{#entry.getValue()}">
        <strong>Error!</strong> ${val}<br>
      </s:iterator>
    </s:iterator>
  </div>
</s:if>

このような実装になる。

流れ説明

だいたいの流れを説明すると、
・actionErrors か fieldErrors があれば内容表示
・actionErrorsはValidationAwareではCollection<String>なので、
 そのまま<s:iterate>
・fieldErrorsはMap<String, List<String>>なので、
 <s:iterator var="entry" value="%{fieldErrors.entrySet()}">
 をして取得できるentrySet (List<String>)で回す。さらにその中がListなので、
 <s:iterator var="val" value="%{#entry.getValue()}">
 とする。

注意点と工夫

最後のvar="val"var="value"としたらなぜか
[ユーザーIDを入力してください。]
のように括弧でくくられてしまい、Listの方が取れてしまうっぽい。
まぁ変数名工夫すればいい話なのですがちょっとハマりましたよ。

actionMessagesでも似たように

<s:iterator var="actionMessage" value="actionMessages">
    ${actionMessage}
</s:iterator>

と書いたらループが回らなかったので

<s:iterator var="mes" value="actionMessages">
    ${mes}
</s:iterator>

みたいに変数名工夫しました。
これもハマりました。。