J'ai le cycle suivant dans un jspx:

<c:forEach var="var" items="${dataFile.list.rows}">
  <li>
    <div>
      <a href="#" onClick="myFunct('${var.url}','escape(${var.title}),'escape(${var.descr})');">
        <img width="108" height="66" alt="" src="${var.img}" />
      </a>
    </div>
  </li>
</c:forEach>

Où la fonction myFunct fait certaines choses par elle-même. Mes problèmes surviennent lorsque ${var.title} ou ${var.descr} contiennent des guillemets ou des guillemets doubles. Je ne peux pas savoir à l'avance s'il y en aura ou quoi.

J'ai essayé ce qui précède, j'ai essayé une petite section js d'aide juste avant l'élément, mais ne sachant pas quel type de guillemets je vais avoir, je ne peux pas deviner si je dois mettre escape("${var.title}"); ou {{X1} }.

Une idée sur la façon de résoudre ce problème? Merci.

1
Stephan 21 déc. 2011 à 21:26

4 réponses

Meilleure réponse

Vous devez le faire côté serveur, pas côté client. Le faire du côté client est de toute façon trop tard. Selon le seul but de la valeur, qu'elle soit utilisée dans le cadre de HTML et ne contienne pas de sauts de ligne, ou en tant que code JS, vous pouvez utiliser la fonction EL fournie par JSTL fn:escapeXml()

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<a onclick="myFunct('${var.url}','${fn:escapeXml(var.title)}','${fn:escapeXml(var.descr)}');">

Ou créez une fonction EL personnalisée qui utilise Apache Commons Lang StringEscapeUtils#escapeJavaScript() sous les couvertures.

<%@taglib prefix="my" uri="http://example.com/functions" %>
...
<a onclick="myFunct('${var.url}','${my:escapeJs(var.title)}','${my:escapeJs(var.descr)}');">

Vous pouvez trouver un exemple concret de création d'une fonction EL au bas de cette réponse.

Je suppose que ça va être utilisé dans le cadre de HTML, donc fn:escapeXml() pourrait être suffisant.

2
Community 23 mai 2017 à 12:05

Je vous suggère de coder sur le serveur http://www.roseindia.net/jsp/jsp-url-encoding.shtml

Ou stockez les choses dans un élément caché

<span id="url" style="display:none">${var.URL}</span>
<span id="title" style="display:none">${var.title}</span>
<span id="desc" style="display:none">${var.descr}</span>

Et faites onClick="return myFunct(['url','title','desc'])">...</a>

function myFunct(parms) {
  var url   = parms[0]?document.getElementById(parms[0]).innerHTML:"No url";
  var title = parms[1]?document.getElementById(parms[1]).innerHTML:"No title";
  var descr = parms[2]?document.getElementById(parms[2]).innerHTML:"No description";
  return false;
}
0
mplungjan 21 déc. 2011 à 17:46

Vous devez transmettre un littéral de chaîne JavaScript valide à myFunct. escape est une fonction JavaScript qui attend également une chaîne valide. Vous devez donc transformer votre chaîne Java en un littéral JavaScript valide. Utilisez apache commons-lang StringEscapeUtils.escapeECMAScript pour y échapper. Vous pourriez en faire une fonction EL, et donc utiliser quelque chose comme

onClick="myFunct('${myFn:escapeJs(var.url)}','${myFn:escapeJs(var.title)}, '${myFn:escapeJs(var.descr)}');"
0
JB Nizet 21 déc. 2011 à 17:52

Vous n'avez pas besoin de créer votre propre fonction EL mais utilisez apache-commons directement depuis votre .tld personnalisé:

<function>
    <name>escapeJavaScript</name>
    <function-class>org.apache.commons.lang.StringEscapeUtils</function-class>
    <function-signature>java.lang.String escapeJavaScript(java.lang.String)</function-signature>
</function>
1
nomad 12 août 2014 à 19:08