バージョンと設定
・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">×</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>
みたいに変数名工夫しました。
これもハマりました。。