J'ai un formulaire d'utilisateur. Si l'utilisateur tape une chaîne avec '
ou "
dans le cadre, je n'ai aucun problème. Le formulaire est soumis et enregistré correctement dans la base de données. Mon problème est lorsque je recharge la page (toutes les entrées peuvent être modifiées et sont chargées dans une liste du fichier JSP avant d'être affichées). En chargeant la page, je reçois une erreur disant:
missing ) after argument list 'Caroline's message', \n
Que dois-je faire pour échapper à cette chaîne pour l'afficher sur le frontal?
Voici le code que j'utilise sur le frontend pour lire les données et les stocker dans un objet JavaScript. Je ne sais pas trop où je dois m'échapper. Le champ à l'origine du problème est c.getComName:
communications[<%=i%>][1] = new CommObject('<%=c.getComId()%>', '<%=c.getComName()%>');
MISE À JOUR AVEC HTML GÉNÉRÉ:
communications[0][1] = new CommObject('101', 'Caroline's Message');
Utilisez la fonction Apache StringEscapeUtils.escapeJavaScript .
Escapes the characters in a String using JavaScript String rules. Escapes any values it finds into their JavaScript String form. Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) So a tab becomes the characters '\\' and 't'.
Je préfère éviter les scripts au milieu de ma page et je devais les utiliser (de plus en plus souvent) pour échapper des chaînes lorsqu'elles étaient utilisées dans du code JavaScript. Je voulais un Expression Language (EL) moyen d'échapper aux chaînes. J'ai créé une très petite balise taglib que j'utilise uniquement à cette fin:
Utilities.Java:
package com.mycom.taglibs;
import org.Apache.commons.lang.StringEscapeUtils;
public class Utilities {
public static String escapeJS(String value) {
return StringEscapeUtils.escapeJavaScript(value);
}
}
mytaglib.tld:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>My Tag Library</description>
<display-name>Tag Utils</display-name>
<tlib-version>1.1</tlib-version>
<short-name>myt</short-name>
<function>
<description>
JavaScript Escape function
</description>
<name>escapeJS</name>
<function-class>com.mycom.taglibs.Utilities</function-class>
<function-signature>Java.lang.String escapeJS(Java.lang.String)</function-signature>
</function>
</taglib>
Et, dans la page JSP:
<%@ taglib prefix="myt" uri="/WEB-INF/mytaglib.tld" %>
The escaped string is: ${myt:escapeJS(variableHoldingTheString)}
fn: escapeXml ne fonctionne pas en JavaScript. Il remplace 'par # & 0039; provoque toujours une erreur lors de l'exécution du JavaScript.
Seulement échapper de la manière JavaScript est correct:\'
La fonction Apache StringEscapeUtils.escapeJavaScript le fait pour vous. Créer une balise pour cela facilite grandement les choses.
Vous pouvez utiliser la fonction d'échappement JSTL fn:escapeXml()
pour supprimer les anomalies dues à des guillemets simples (`) . L'exemple suivant montre la différence.
Par exemple:
<c:set var="string1" value="This is abc's first String."/>
<c:set var="string2" value="This is abc's second String."/>
<p>With escapeXml() Function:</p>
<p>string (1): ${fn:escapeXml(string1)}</p>
<p>Without escapeXml() Function:</p>
<p>string (2): ${fn:escapeXml(string2)}</p>
R&EACUTE;SULTAT
string (1): il s'agit du premier String de abc.
string (2): C'est la deuxième chaîne d'abc.
Lorsque vous renvoyez le code HTML de la classe CommObject, ajoutez le "au lieu de" et avant le nom (par exemple, le message de Caroline)
Comme ceci: retourne "\" "+ comName +"\"";