Spring MVC中c:out设置escapeXml=false对Model取值不生效问题
问题差异的根本原因
两种写法最终传入c:out标签的实际value值完全不同,和c:out的escapeXml属性逻辑无关:
- 写法a的硬编码字符串在JSP文件解析阶段,会被JSP容器提前把字符串里的HTML实体(
<、>)转成对应的原始字符<、>,最终传入c:out的实际值为<code><b>This</b> is an <br/> example</code> - 写法b从Model中读取的
element1属性,实际存储的就是未被提前转义的实体字符串<code><b>This</b> is an <br/> example</code>
escapeXml="false"的作用是让c:out不对传入的value做二次转义,直接输出原始内容:
- 写法a输出的是可被浏览器解析的HTML标签,所以会看到粗体、换行效果
- 写法b输出的是HTML实体字符串,浏览器解析后会把
<显示为<、>显示为>,不会识别为HTML标签
验证方法
你可以在JSP页面中添加一行代码直接打印element1的原始值,即可确认差异:
<div>element1原始值:<%= pageContext.findAttribute("element1") %></div>
输出结果会直接展示带<、>的实体字符串,说明你在往Model中存入element1的阶段,就已经对内容做过一次HTML转义。
解决方案
如果要让写法b的效果和a一致,可选两种方案:
- 调整后端存值逻辑,存入Model之前不要对HTML内容做转义,直接存原始HTML字符串
<b>This</b> is an <br/> example - 若无法修改后端存值逻辑,可在JSP输出时先对实体字符串做反转义再输出,比如使用Apache Commons Lang工具包的
StringEscapeUtils.unescapeHtml4()方法:
<%@ page import="org.apache.commons.lang3.StringEscapeUtils" %> <c:out value="${StringEscapeUtils.unescapeHtml4(element1)}" escapeXml="false"/>
内容的提问来源于stack exchange,提问作者user1532449
相关产品推荐
相关产品推荐

