如何在JSTL函数中转义双引号?

时间:2011-08-18 01:31:53

标签: java jstl el

我需要使用JSTL replace函数将"更改为\",以便在输入标记中使用字符串,如:

<input type="hidden" name="text" size="40" value="${text}">

如果${text}包含",则HTML将被破坏。

所以我试过

<input type="hidden" name="text" size="40" value="${fn:replace(text, "\"", "\\\""}">

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"'}">

但没有奏效。该页面出现错误,如

  

org.apache.el.parser.ParseException:遇到“”}“”}“”在线   1,第32栏。期待以下之一:       “” ...       “)”......       “[”......       “,”......       “&gt;” 中...       “gt”......       “&LT;” ...       “lt”......       “&gt; =”......       “ge”......       “&lt; =”......       “le”......       “==”......       “eq”......       “!=”......       “ne”......       “&安培;&安培;” ...       “和”......       “||” ...       “要么” ...       “*”......       “+”......       “ - ”......       “/”......       “div”......       “%”......       “mod”......

我该怎么做?

更新

我错过了替换功能的密切关注。正确的是这个与亲密的人:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"')}">

UPDATE2

我发现在发布文本时,使用\并不是一个好主意,因为这个原因why can't use \" in HTML input tag?。代码应该是这样的:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '&quot;')}">

3 个答案:

答案 0 :(得分:22)

它不起作用,因为\是Java字符串中的转义字符。要按字面意思表示,您需要再次使用另一个\来转义它。此外,"是EL中的特殊字符,您还需要将其转义为字面表示它。所以,正确的语法应该是:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '\"', '\\\"'}">

但是,你应该实际使用fn:escapeXml()来阻止XSS。它不仅逃避了引号,还逃避了其他角色。

<input type="hidden" name="text" size="40" value="${fn:escapeXml(text)}">

另见:

答案 1 :(得分:5)

你做错了(使用 fn:replace )。

正确的方法是:

<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)

编辑:更多思考:

  • 使用 fn:escapeXml (由BalusC编写)的方式也有效,看起来更好(没有嵌套标签)
  • 使用 fn:replace 来模仿 fn:escapeXml 正在寻找麻烦。你忘记包含一些应该转义的字符。只需使用现有的,经过试用和测试的 fn:escapeXml (或 c:out

答案 2 :(得分:4)

你可能有一个错字:我没有在那里看到一个关闭的paren。试试这个:

${fn:replace(news.title, "\"", "\\\"")}

此外,您是要尝试输出结果还是尝试更新news.title,以便下次访问news.title时更换到位?这将用于输出结果,但不能替换实际值:此调用不会更改news.title