Struts2在JSP页面展示HTML格式数据无法解析为纯文本的问题求助
嘿,我之前也踩过Struts2这个处理HTML文本的坑!你遇到的问题核心是:Struts2对转义后HTML实体的处理逻辑和Struts1不一样,单纯用escapeXml或者escapeHtml根本达不到你要的“去掉标签留纯文本”的效果。
问题根源
你的数据是已经转义过的HTML实体(比如<p>、&),而Struts2的escapeXml属性只是控制是否把原始特殊字符转成实体,反过来,escapeXml="false"只会把<p>还原成<p>标签,而不是去掉这些标签——这就是为什么你之前的尝试都没用。
解决方案
你需要两步处理:先把转义后的实体还原成真实的HTML内容,再剥离所有HTML标签,最后得到纯文本。下面给你两种可行的方法:
方法1:用Struts2内置的OGNL函数直接处理
Struts2自带了unescapeHtml(反转义HTML实体)和stripTags(剥离HTML标签)两个OGNL函数,把它们结合起来用就行:
<s:property value="stripTags(unescapeHtml(yourDataVariable))" />
举个例子,你的示例数据<p> Ladies & gentelmen,<br> I am glad to announce my <font color="#CF0066">Retirement on this......</p>,经过这两个函数处理后,会先转成:<p> Ladies & gentelmen,<br> I am glad to announce my <font color="#CF0066">Retirement on this......</p>
然后剥离所有标签,得到你想要的纯文本:Ladies & gentelmen, I am glad to announce my Retirement on this......
方法2:自定义工具类(更灵活可控)
如果内置函数满足不了你的特殊需求(比如想保留某些标签、自定义处理规则),可以自己写个工具类:
import org.apache.commons.text.StringEscapeUtils; public class HtmlTextProcessor { public static String getPureTextFromEscapedHtml(String escapedHtml) { if (escapedHtml == null || escapedHtml.isEmpty()) { return ""; } // 第一步:反转义HTML实体,得到真实的HTML内容 String unescapedHtml = StringEscapeUtils.unescapeHtml4(escapedHtml); // 第二步:用正则剥离所有HTML标签 return unescapedHtml.replaceAll("<[^>]+>", "").trim(); } }
然后在JSP里调用这个工具类的静态方法:
<s:property value="@com.yourpackage.HtmlTextProcessor@getPureTextFromEscapedHtml(yourDataVariable)" />
注意事项
- 如果你用的是老版本的Struts2,可能没有内置的
unescapeHtml函数,这时候直接用方法2的自定义工具类更稳妥。 - 正则剥离HTML标签的方法适合大部分场景,但如果你的HTML内容非常复杂(比如包含嵌套标签、注释),可以考虑用Jsoup这类专业的HTML解析库来处理,效果会更好。
内容的提问来源于stack exchange,提问作者TechyGuy

