2010-07-15 35 views
8

Estoy recuperando un valor de nuestro DB usando JSTL. Lo estoy insertando directamente en algunos javascript para usarlo como una variable. Necesito el resultado del valor que el JSTL tiene para ser escapado porque si hay comillas simples o dobles, rompe mi script. El valor es especificado por el usuario.Salida JSTL escapado?

Ejemplo:

haciendo lo siguiente:

<c:set var="myVar" value="Dale's Truck"/> 

<script type="text/javascript"> 
    var mayVar = '${myVar}'; 
</script> 

en realidad terminar pareciéndose a:

<script type="text/javascript"> 
    var mayVar = 'Dale's Truck';//extra single quote breaks the JS 
</script> 

por eso es necesario para convertir el JSTL var que se escapó como "Dale% 27s Truck "before es get to the JS porque ya es demasiado tarde cuando llega a mi JS para poder hacerlo en JS.

Respuesta

12

Intente utilizar fn:replace:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

<c:set var="myVar" value="Dale's Truck" /> 
<c:set var="search" value="'" /> 
<c:set var="replace" value="%27" /> 

<c:set var="myVar" value="${fn:replace(myVar, search, replace)}"/> 

o puede escapar la comilla simple con una barra invertida:

<c:set var="replace" value="\\'" /> 

o si no quiero ni hacer todo eso y está seguro de que la cadena no contiene comillas dobles, por qué no hacer:

var myVar = "${myVar}"; //string enclosed with double quotes instead of single quotes 

Pero si la cadena tiene doub le quotes, usted todavía tendrá que escapar de ellos:

<c:set var="search" value="\"" /> 
<c:set var="replace" value="\\\"" /> 
+0

Eso funciona, gracias! Usé el enfoque doble barra invertida en lugar de% 27. – UpHelix

+2

¡Nunca escriba su propia función de escape! Porque va a estar mal. Por ejemplo, el ejemplo de doble barra invertida falla para la entrada "a b \\ 'c". Se convertirá en \\ 'para que la barra invertida se escape y la comilla simple terminará la cadena. Use funciones existentes que hayan sido probadas y depuradas, p. var x = ' $ {myVar}'; –

0

La otra respuesta ya fue aceptada, pero David Balazic hizo un gran punto. La función <spring:escapeBody> funciona mejor.

<spring:escapeBody htmlEscape="false" javaScriptEscape="true">${myVar}</spring:escapeBody>