如何在JSP中转义JavaScript?

我完全坚持这一点,我试图逃避JSP中的单引号。 我有一些数据,我直接输出到JSstring和单引号似乎是造成问题。

这是我的代码:

<dsp:droplet name="/atg/dynamo/droplet/ForEach"> <dsp:param value="${CommerceItems}" name="array" /> <dsp:param name="elementName" value="CommerceItem" /> <dsp:oparam name="outputStart"> var itemNameList =' </dsp:oparam> <dsp:oparam name="output"> <dsp:getvalueof id="Desc" param="CommerceItem.auxiliaryData.productRef.displayName"> ${fn:replace(Desc, "'", "\\/'")} </dsp:getvalueof> </dsp:oparam> <dsp:oparam name="outputEnd">';</dsp:oparam> </dsp:droplet> 

这里是我得到的输出:

 var itemNameList =' Weyland Estate Santa Barbara Pinot Noir Raymond \/'Prodigal\/' North Coast Cabernet Sauvignon Chateau Haute Tuque'; 

但这是错误的,我只需要/'Prodigal'/或者根本没有单引号!


编辑 :或者我实际上需要用\反斜杠转义引号?

正斜杠不是一个转义字符。 这是反斜杠。

 ${fn:replace(Desc, "'", "\\'")} 

(是的,它已经提交了两次,因为这也是 Java中的转义字符!)

但是,您不仅需要用' \'重新空格,还需要用\\nreplace\n (换行符)。 该string已被打印在多行,这也使一个无效的JSstringvariables。 你的最终结果基本上是这样的:

 var itemNameList = '' + '\nWeyland Estate Santa Barbara Pinot Noir' + '\nRaymond \'Prodigal\' North Coast Cabernet Sauvignon' + '\nChateau Haute Tuque'; 

(请注意,这里的语法荧光笔同意我的意见,但不在你的意见上)

然而,还有更多可能需要转义的特殊字符。 它们全部由Apache Commons Lang StringEscapeUtils#escapeEcmaScript()覆盖。 更容易的是创build一个自定义的EL函数,调用该方法。 如果还没有完成, commons-lang.jar/WEB-INF/lib下载commons-lang.jar 。 然后创build一个/WEB-INF/functions.tld文件,如下所示:

 <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <display-name>Custom Functions</display-name> <tlib-version>1.0</tlib-version> <uri>http://example.com/functions</uri> <function> <name>escapeJS</name> <function-class>org.apache.commons.lang3.StringEscapeUtils</function-class> <function-signature>java.lang.String escapeEcmaScript(java.lang.String)</function-signature> </function> </taglib> 

所以你可以使用它如下:

 <%@taglib prefix="util" uri="http://example.com/functions" %> ... ${util:escapeJS(Desc)}