Thymeleafを使って、Modelに登録されたフィールドを文字列として画面出力することは多くあります。その際、よく必要となるのは改行コードを <br /> に変換して、出力する処理。
Modelのコード
<span class="fz-14px">//エラーリストからエラーを取り出して、各エラー文言の区切りとして、「\\n」をつける。</span>
<span class="fz-16px">for (messageDetail err: errorList.getMessages()){
errorMsg.append(err.getDetail());
errorMsg.append("\\n");
}
***Form.setErrMsg(errorMsg.toString());</span>
元のコード
<span class="fz-16px"><span th:utext="*{errMsg}" ></span></span> <span class="fz-14px"> <span class="bold-red"><!--当たり前ですが、改行されない--></span></span>
修正したコード
<span class="fz-14px"><span>
<th:block th:if="*{errMsg != null}">
<th:block th:each="line: *{errMsg.split('\\r\\n|\\r|\\n', -1)}"><span class="blue"><!-- 改行コードで</span></span>
<span class="fz-14px"><span class="blue">分割</span></span>
<span class="fz-14px"><span class="blue">してループ --></span>
<th:block th:text="${line}" /><br />
</th:block>
</th:block>
</span></span>
少し面倒くさいですが、改行コードでsplitして配列化したものをループさせて、各行の末尾に
をつけることです。
補足
Modelに登録する際、改行コードを「errorMsg.append(“
“);」に指定すれば、th:utextを利用する方法もありますが、文字列自体がエスケープされなくなってしまうため、XSSの危険があります。
<span class="fz-14px"><span th:utext="*{errMsg}" ></span></span> <span class="fz-14px"><!--errMsgの改行コードは<br />なら、改行される--></span>


コメント