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



我使用Struts2,在我的JSP中有一个标签标签,其中包含label和name属性,如下面的

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

Name属性包含值Maz&apos;s Organisation(来自变量editNom.name),该值应显示为Maz's Organisation。当我在具有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是一种字符编码。&apos&amp等是HTML字符实体,是特殊字符的转义表示。

你滥用了UTF-8这个词,因此滥用了UTF-8的概念,因此你在谷歌上的每一次搜索都会把你引向错误的方向。

如果使用JSP EL(${}表示法)输出文本,则需要对文本进行转义(在.properties文件或数据库中,无论源数据来自何处),而如果使用Struts标记(如<s:text /><s:property />,甚至JSTL标记),则无需进行转义,因为它们具有内置的转义机制。它按原样运行。

然而,在撇号的情况下,您应该将其加倍以使其工作,就像一样

editNom.name=Maz''s Organisation

,否则它将被丢弃,您将获得输出

迷宫组织

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

如果您不想要或不能使用<s:property/>标记,则应该使用一些util取消对操作中的数据的转义。

In Struts2 UI标记从写入JSP的文本中转义HTML。<s:label>标签是一个UI标签。所以您不应该关心XSS保护。但是,如果您的初始文本已经转义,那么它将传递给转义&两次的标记。因此,您将拥有无法读取的内容。

您可以尝试StringEscapeUtils类来取消对HTML的注释,但它似乎不支持撇号。

转义Html4

支持所有已知的HTML 4.0实体,包括时髦的重音符号。注意常用的撇号转义符(')是不是法律实体,因此不受支持)。

如果您探索StringEscapeUtils类,那么您会找到其他方法来转义字符串。其中之一是

escapeXml

仅支持五个基本XML实体(gt、lt、quot、amp、apos)。不支持DTD或外部实体。


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

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

最新更新