Springの出力時のHTMLエスケープの仕様について、調査した結果を記載しておきます。なお、バージョン4.1.4での調査結果で、バージョンによって動作は異なる可能性があります。
HTMLエスケープは、以下のレベルで設定できます。1 < 2 < 3 での順で設定が上書きされます。
1. アプリケーションレベル
web.xmlにdefaultHtmlEscapeを定義
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
2. ページレベル
ページ内にdefaultHtmlEscapeを定義
<spring:htmlEscape defaultHtmlEscape="true" />
3. タグレベル
ページの各タグにhtmlEscapeを定義
<spring:message htmlEscape="true" ...>
<form:input path="name" htmlEscape="true" ...>
で、ここで注意したいのは、web.xmlのdefaultHtmlEscapeの評価の仕方がタグによって異なっているということです。 spring:messageなどのspringタグの場合は、defaultHtmlEscapeが明示的にtrueに設定してあった場合にのみ、HTMLエスケープします。これに対して、form:inputなどのformタグの場合は、defaultHtmlEscapeが明示的にtrueに設定していなくても、未設定であればHTMLエスケープします。
全てのレベルで設定が無かった場合にのみ両者に違いが出ます。
springタグの場合は、以下の条件で判定し、
(this.defaultHtmlEscape != null && this.defaultHtmlEscape.booleanValue())
formタグの場合は、以下の条件で判定します。
(defaultHtmlEscape == null || defaultHtmlEscape.booleanValue())
[参考]
詳細に関しては、実際にソースコードを確認してみると分かると思います。
HtmlEscapingAwareTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/HtmlEscapingAwareTag.java?av=f
AbstractFormTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/form/AbstractFormTag.java?av=f
RequestContextAwareTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/RequestContextAwareTag.java?av=f