Struts 2 <s:label> 标签不显示 UTF-8 字符

Struts 2 <s:label> tag doesn't display UTF-8 characters

我正在使用 Struts 2,我的 JSP 中有一个 label 标记,其中包含 label 和 name 属性,如下所示

<s:label label="Name" name="editNom.name" />

名称属性包含应显示为 Maz's Organisation 的值 Maz&apos;s Organisation(来自变量 editNom.name)。当我使用 UTF-8 编码直接在 JSP 中使用 ${editNom.name} 时,此值显示正常。但是,在同一个 JSP 中,当我使用上面的 struts 标签时,它显示为 Maz&apos;s Organisation.

有人可以建议我如何将 UTF-8 字符编码应用于 struts 标签吗?

编辑 - 2017 年 2 月 10 日:

我找到了根本原因。在chrome中检查我的网页时,我发现在JSP中直接使用变量时的值是

Maz&apos;s Organisation

当我在 struts 标签中使用它时,它将 & 转义为 &amp; 因此值变为

Maz&amp;apos;s Organisation

如果我能阻止struts逃逸&,我想这个问题就可以解决了。不知道该怎么做。有人可以帮助我吗?

UTF-8 is a character encoding. &apos, &amp etc... are HTML character entitities,特殊字符的转义表示。

您误用了 UTF-8 单词,因此误用了 UTF-8 概念,因此您在 google 上进行的每一次搜索都将您引向了错误的方向。

当您需要转义文本时(在 .properties 文件或数据库中,无论您的源数据来自何处)如果您使用 JSP 输出它EL(${} 表示法),如果使用 <s:text /><s:property /> 等 Struts 标签,甚至是 JSTL 标签,则不需要这样做,因为 they've a built-in escaping mechanism.它有效 as-is.

但是,对于撇号,您应该将其加倍才能使其生效,例如

editNom.name=Maz''s Organisation

,否则会被丢弃,你会得到输出

Mazs Organisation

就是这样。你只是走错方向了。

如果您不想或不能使用 <s:property/> 标签,您应该 un-escape 使用一些实用程序操作中的数据。

在Struts2UI标签中转义HTML是从写到JSP的文本中出来的。 <s:label> tag 是一个 UI 标签。所以你不应该关心 XSS 保护。但是,如果您的初始文本已经转义,那么它会传递给转义 & 两次的标签。因此,您将无法阅读内容。

你可以试试StringEscapeUtilsclass反转义HTML,不过好像不支持撇号

escapeHtml4

Supports all known HTML 4.0 entities, including funky accents. Note, that the commonly used apostrophe escape character (') is not a legal entity and so is not supported).

如果您探索 StringEscapeUtils class 那么您会发现其他转义字符串的方法。其中之一是

escapeXml

Supports only the five basic XML entities (gt, lt, quot, amp, apos). Does not support DTDs or external entities.


现在,你可以写一个getter来翻译一个字符串

public getName() { return StringEscapeUtils.unescapeXml(name); }