You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC中c:out设置escapeXml=false对Model取值不生效问题

问题差异的根本原因

两种写法最终传入c:out标签的实际value值完全不同,和c:out的escapeXml属性逻辑无关:

  • 写法a的硬编码字符串在JSP文件解析阶段,会被JSP容器提前把字符串里的HTML实体(&lt;、&gt;)转成对应的原始字符<、>,最终传入c:out的实际值为 <code><b>This</b> is an <br/> example</code>
  • 写法b从Model中读取的element1属性,实际存储的就是未被提前转义的实体字符串 <code>&lt;b&gt;This&lt;/b&gt; is an &lt;br/&gt; example</code>

escapeXml="false"的作用是让c:out不对传入的value做二次转义,直接输出原始内容:

  • 写法a输出的是可被浏览器解析的HTML标签,所以会看到粗体、换行效果
  • 写法b输出的是HTML实体字符串,浏览器解析后会把&lt;显示为<、&gt;显示为>,不会识别为HTML标签

验证方法

你可以在JSP页面中添加一行代码直接打印element1的原始值,即可确认差异:

<div>element1原始值:<%= pageContext.findAttribute("element1") %></div>

输出结果会直接展示带&lt;、&gt;的实体字符串,说明你在往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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:39:03