Cómo escapar apóstrofo o citas en un JSP (utilizado por JavaScript)


Answers

Prefiero evitar los scriptlets en el medio de mi página y tuve que usarlos (cada vez más) para escapar de las cadenas cuando se usan en código JavaScript. Yo quería una forma de Lenguaje de Expresión (EL) de escapar de las cuerdas. Creé un taglib personalizado muy pequeño que uso para este propósito:

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>

Y, en la página JSP:

<%@ taglib prefix="myt" uri="/WEB-INF/mytaglib.tld" %>
The escaped string is: ${myt:escapeJS(variableHoldingTheString)}
Question

Tengo un formulario de usuario. Si el usuario escribe una cadena con ' o " como parte de ella, no tengo ningún problema. El formulario se envía y se guarda correctamente en la base de datos. Mi problema es cuando recargo la página (todas las entradas se pueden modificar y cargar en un archivo). enumere en el JSP antes de que se muestre). Al cargar la página aparece un mensaje de error que dice:

missing ) after argument list 'Caroline's message', \n

¿Qué debo hacer para escapar de esta cadena y mostrarla en la interfaz?

Aquí está el código que estoy usando en la interfaz para leer los datos y almacenarlos en un objeto de JavaScript. No estoy completamente seguro de dónde necesito escapar. El campo que causa el problema es c.getComName:

communications[<%=i%>][1] = new CommObject('<%=c.getComId()%>', '<%=c.getComName()%>');

ACTUALIZADO CON HTML GENERADO:

communications[0][1] = new CommObject('101', 'Caroline's Message');



También tenemos una solución muy buena de Spring:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<spring:message code="${propertyName}" javaScriptEscape="true"/>

Por lo tanto, el problema de la pregunta de esta publicación se puede resolver de esta manera:

communications[<%=i%>][1] = new CommObject('<spring:message code="${c.comId}" javaScriptEscape="true"/>', '<spring:message code="${c.comName}" javaScriptEscape="true"/> <%=c.getComName()%>');




Podría usar las etiquetas básicas de JSP:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>      
var jsVar = "<c:out value='${stringVariable}' />";



Cuando devuelva el código HTML de la clase CommObject, agregue el \ "en lugar del 'y antes del nombre (por ejemplo, el mensaje de Caroline)

De esta manera: devuelve "\" "+ comName +" \ "";