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