¿Cómo escapar de JavaScript en JSP?
string escaping (1)
La barra diagonal no es un carácter de escape. Esa es la barra invertida.
${fn:replace(Desc, "''", "//'")}
(Sí, ha sido presentado dos veces, ¡porque también es un personaje de escape en Java!)
Sin embargo, no solo necesita reparar ''
por /'
, también debe reemplazar /n
(nuevas líneas) por //n
. La cadena se imprime en varias líneas, lo que la convierte también en una variable de cadena JS no válida. Su resultado final básicamente debe verse así:
var itemNameList = ''''
+ ''/nWeyland Estate Santa Barbara Pinot Noir''
+ ''/nRaymond /'Prodigal/' North Coast Cabernet Sauvignon''
+ ''/nChateau Haute Tuque'';
(tenga en cuenta que el resaltador de sintaxis está de acuerdo conmigo aquí, pero no en el suyo)
Sin embargo, hay muchos más caracteres especiales que se deben escapar. Todos están cubiertos por Apache Commons Lang StringEscapeUtils#escapeEcmaScript()
. Mucho más fácil es crear una función EL personalizada que llame exactamente ese método. Si aún no lo ha hecho, descargue y suelte commons-lang.jar
en /WEB-INF/lib
. A continuación, cree un archivo /WEB-INF/functions.tld
la siguiente manera:
<?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>
Para que pueda usarlo de la siguiente manera:
<%@taglib prefix="util" uri="http://example.com/functions" %>
...
${util:escapeJS(Desc)}
Estoy totalmente atrapado en esto, estoy tratando de escapar de una sola cita en un JSP. Tengo algunos datos que estoy generando directamente en una cadena JS y las comillas simples parecen estar causando problemas.
Aquí está mi código:
<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>
Y aquí está la salida que obtengo:
var itemNameList =''
Weyland Estate Santa Barbara Pinot Noir
Raymond //''Prodigal//'' North Coast Cabernet Sauvignon
Chateau Haute Tuque'';
¡Pero esto está mal, y solo necesito /''Prodigal''/
o sin comillas!
EDITAR : ¿O realmente necesito escapar las comillas con /
barra diagonal inversa?