tags:

views:

1357

answers:

2

I have an object field with person's last name.

If I use ${person.lastName}, I get O'Brian

If I use

 <c:out value="${person.lastName}"/>

I get O'Brian

Both outputs breaks the next jsp code in IE

 <a href="#" 
    class="delete" 
    onclick="if(confirm('<c:out value="${application.lastName}"/> ' + _('Are you sure you want to delete this application?'))) {deleteApplication('${application.identifier}')};return false;"><bean:message key="application.delete"/></a>

because it gets transformed to

    onclick="if(confirm('O&#039;Brian '

or

    onclick="if(confirm('O'Brian '

I would need O'Brian to be escaped as O\'Brian

Any idea how to solve this issue?

SOLUTION

The most elegant solutions seems to use a simple Tag.

package view;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class EscapeJS extends SimpleTagSupport {
    public String str;

    public void doTag() throws JspException, IOException {
     getJspContext().getOut().print(str.replaceAll("\'", "\\\\'"));
    }

    public String getStr() {
     return str;
    }

    public void setStr(String str) {
     this.str = str;
    }

}

Then place in WEB-INF a utils.tld file:

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"&gt;
<taglib>
    <tlibversion>1.2</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>bean</shortname><uri>utilsTags</uri>
    <uri>utilsTags</uri>
    <tag>
     <name>escapeJS</name>
     <tagclass>view.EscapeJS</tagclass>
     <bodycontent>scriptless</bodycontent>
     <attribute>
      <name>str</name>
      <required>true</required>  
      <rtexprvalue>true</rtexprvalue> 
     </attribute>    
    </tag>  
</taglib>

Then inside your jsp:

<%@ taglib prefix="utils" uri="utilsTags" %>

<utils:escapeJS str="${application.firstName}"/>
+1  A: 

Store it as O'brian in the database, but before displaying it do a find replace to convert any ' to \'

Jared
I want to store the value as O'Brian, because most of the time I want to display it as O'Brian not as O'Brian
Sergio del Amo
updated answer, looks like you need to find replace on ' to \' before displaying values.
Jared
+2  A: 

You could define a new EL function that escapes strings for you.

E.g.

In Java

public class MyStringUtil {
  public static String escapeJs( String str )
  {
    // escape the string (e.g. replace ' with \')
  }
}

In a tag library descriptor file:

<function>
 <name>escapeJs</name>
 <function-class>package.to.MyStringUtil</function-class>
 <function-signature>
   java.lang.String escapeJs( java.lang.String )
 </function-signature>
</function>

Then in your JSP (assuming you've included your .tld with a prefix of foo:

<a href="#" 
  class="delete" 
  onclick="if(confirm('${foo:escapeJs(person.lastName)}' + _('Are you sure you want to delete this application?'))) {deleteApplication('${application.identifier}')};return false;"><bean:message key="application.delete"/></a>
jimr