我使用Struts2,在我的JSP中有一个标签标签,其中包含label和name属性,如下面的
<s:label label="Name" name="editNom.name" />
Name属性包含值Maz's Organisation
(来自变量editNom.name
),该值应显示为Maz's Organisation
。当我在具有UTF-8编码的JSP中直接使用${editNom.name}
时,此值显示良好。但是,在同一个JSP中,当我使用上面的struts标记时,它显示为Maz's Organisation
。
有人能建议我如何将UTF-8字符编码应用于struts标签吗?
编辑-2017年2月10日:
我找到了根本原因。在chrome中检查我的网页时,我发现在JSP中直接使用变量时的值是
Maz's Organisation
其中,当我在struts标签中使用它时,它从&
逃逸到&
,因此该值变为
Maz&apos;s Organisation
如果我能阻止struts逃离&
,我想这个问题可以解决。不知道该怎么做。有人能帮我吗?
UTF-8是一种字符编码。&apos
、&
等是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); }