2010-07-15 6 views
8

Je récupère une valeur de notre base de données en utilisant JSTL. Je l'insère directement dans un javascript pour l'utiliser comme variable. J'ai besoin de la sortie de la valeur que le JSTL détient pour être échappé parce que s'il y a des guillemets simples ou doubles, il casse mon script. La valeur est spécifiée par l'utilisateur.La sortie JSTL s'est échappée?

Exemple:

Faire ce qui suit:

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

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

finirais réellement ressembler à:

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

donc je dois convertir JSTL var à échapper comme « Dale% 27s Truck "avant arrive à la JS car il est déjà trop tard quand il arrive à mon JS pour être en mesure de le faire dans JS.

Répondre

12

Essayez d'utiliser 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)}"/> 

ou vous pouvez échapper à la citation simple avec une barre oblique inverse:

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

ou si vous ne voulez même pas faire tout cela et vous êtes sûr que la chaîne ne contiendra pas de guillemets doubles, pourquoi ne pas faire:

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

Mais si la chaîne a le citations, vous aurez toujours besoin de leur échapper:

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

Cela fonctionne, merci! J'ai utilisé l'approche double antislash au lieu de% 27. – UpHelix

+2

N'écrivez jamais votre propre fonction d'échappement! Parce que ce sera faux. Par exemple, l'exemple de double backslash échoue pour l'entrée "a b \\ 'c". Il sera converti en \\ 'afin que la barre oblique inverse soit échappée et que la citation unique termine la chaîne. Utilisez les fonctions existantes prouvées et déboguées, par ex. var x = ' $ {myVar}'; –

0

L'autre réponse était déjà acceptée, mais David Balazic a fait un excellent point. La fonction <spring:escapeBody> fonctionne mieux.

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