JSTL转义特殊字符

28

我遇到了一个关于特殊字符的奇怪问题。 在 JSP 中,我使用字段名作为 id,而这个名称可以是任何东西。

id="<1 and &>2" (OR)
id="aaa & bbb"

除了名称,我没有其他选项来使用 ID,这是我从后端获取的唯一信息。

那么,有没有逻辑可以使用 JSTL 删除所有特殊字符。 在当前情况下,在JS中,我将对ID执行某些操作。这会导致在每种类型的浏览器上都出现许多问题。

请建议,提前感谢...

4个回答

52

JSTL 提供两种方式来转义 HTML 特殊字符:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
[…]
<c:out value="${myName}"/> 

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
[…]
${fn:escapeXml(myName)}

两者都会将特殊字符转换为相应的HTML实体:(<变成&lt;&变成&amp;...)。

请注意,标识符必须在HTML中进行编码,但不要在JavaScript中进行编码。


所以呢?< 包含一个 HTML 特殊字符: &。如果 < 必须被字面显示 (即在网页中显示为 <),则必须对其进行转义,使其变成 &lt;。 - JB Nizet
抱歉,这不是关于显示的问题,而是关于将值放入示例div id中的问题。我无法在js中引用此ID。 - Max
请尝试以下代码:<html> <body> <div id="someNumber:RANGE(<0.5)">你好</div> <script> alert(document.getElementById("someNumber(<0.5)").innerHTML); </script> </body> </html> - Max
这样行不通。如果ID是someNumber:RANGE(<0.5),它必须被编码为someNumber:RANGE(<0.5)放在HTML中,但不能在Javascript中编码。而且Javascript代码中使用的ID显然必须包含:RANGE部分。以下内容按预期工作:<html> <body> <div id="someNumber:RANGE(<0.5)">Hello</div> <script>alert(document.getElementById("someNumber:RANGE(<0.5)").innerHTML); </script> </body> </html>。请注意,通过fn:escapeXml传递“someNumber:RANGE(<0.5)”将得到“someNumber:RANGE(<0.5)” 。 - JB Nizet
谢谢朋友,这就是我要找的。请在答案部分更改您的回答。对某人可能有帮助。 - Max
显示剩余2条评论

26

我认为你的问题被误解了。 我也遇到了同样的问题,通过设置excapeXml="false"来解决了它。

<c:out value="${id}" escapeXml="false"/> 

我在数据库中有这样的数据:

&lt;Hello World&gt;

并且escapeXml="false"使其显示出来。

<Hello World>

7
在数据库中进行HTML转义字符串并不是一个好主意。 - Lluis Martinez

2

1
虽然这样做可以工作,但这不是正确的方式。在Web应用程序中,转义应该在视图端而不是业务端完成。JSP是视图,使用Java代码是错误的。请使用JSP标签库/EL函数。 - BalusC
@BalusC 我同意,可以将相同的代码移动到标签中并使用它。 - Ramesh PVK
2
JSTL的<c:out>fn:escapeXml()已经可以实现这个功能了,不需要其他库。 - BalusC
@BalusC 对不起,我不知道JSTL函数。我还建议使用${fn:escapeXml}。谢谢。 - Ramesh PVK
伙计们,他需要的是 JavaScript 转义,而不是 XML 转义!即使你使用 c:out escapeXml="true" 进行转义,像撇号这样的字符仍然没有被转义以在 JavaScript 中使用! - Sorin Postelnicu
显示剩余5条评论

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接