Reputation: 969
I have a user form. If the user types in a string with '
or "
as part of it I have no problem. The form is submitted and saved correctly to the database. My problem is when I reload the page (all entries can be modified and are loaded into a list in the JSP before being displayed). On loading the page I get an error saying:
missing ) after argument list 'Caroline's message', \n
What do I need to do to escape this string for displaying it on the frontend?
Here is the code I am using on the frontend to read in the data and store it in a JavaScript object. I am not fully sure where I need to escape. The field causing the problem is c.getComName:
communications[<%=i%>][1] = new CommObject('<%=c.getComId()%>', '<%=c.getComName()%>');
UPDATED WITH HTML GENERATED:
communications[0][1] = new CommObject('101', 'Caroline's Message');
Upvotes: 36
Views: 93383
Reputation: 1286
I have faced this problem while I was passing data from my servlet to my JSP
then to my code Javascript to create JSON
object so I need it '
but it's rendered like ' ;
which can't be in the JSON
object so to fixed I had simply to change my JSP
from writing '
to `
the 6 key and it worked fine.
Upvotes: 0
Reputation: 91
fn:escapeXml
does not work in JavaScript. It replaces '
with #&0039;
still causing an error when the JavaScript is executed.
Only escaping in the JavaScript manner is correct: \'
The Apache StringEscapeUtils.escapeJavaScript function does this for you. Creating a taglib for it greatly simplifies matters.
Upvotes: 3
Reputation: 44
Also we have very nice solution from Spring:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<spring:message code="${propertyName}" javaScriptEscape="true"/>
So, issue from the question of this post can be resolved in this way:
communications[<%=i%>][1] = new CommObject('<spring:message code="${c.comId}" javaScriptEscape="true"/>', '<spring:message code="${c.comName}" javaScriptEscape="true"/> <%=c.getComName()%>');
Upvotes: 2
Reputation: 21
You could use JSP core tags:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
var jsVar = "<c:out value='${stringVariable}' />";
Upvotes: -2
Reputation: 199333
That's strange.
What about:
'<%=c.getComName().replaceAll("\\'","\\\\'")%>'
If that works, you just have to figure out how to add the \".
Upvotes: -1
Reputation: 99
You can use the JSTL escape function fn:escapeXml()
to get rid of anomalies caused due to single quotes(`).
The following example demonstrates the difference.
For example:
<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>
RESULT
string (1): This is abc s first String.
string (2): This is abc's second String.
Upvotes: 2
Reputation: 16282
I prefer to avoid scriptlets in the middle of my page and was having to use them (increasingly often) to escape strings when used in JavaScript code. I wanted an Expression Language (EL) way of escaping the strings. I created a very small custom taglib that I use for just this purpose:
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>
And, in the JSP page:
<%@ taglib prefix="myt" uri="/WEB-INF/mytaglib.tld" %>
The escaped string is: ${myt:escapeJS(variableHoldingTheString)}
Upvotes: 49
Reputation: 42240
Use the Apache StringEscapeUtils.escapeJavaScript function.
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'.
Upvotes: 24
Reputation: 4880
When you return the HTML from the CommObject class add in the \" instead of the ' and before the name (e.g. Caroline's message)
Like this: return "\"" + comName + "\"";
Upvotes: 0