Избегайте апострофа как c: out JSP - PullRequest
3 голосов
/ 19 июня 2009

У меня есть поле объекта с фамилией человека.

Если я использую $ {person.lastName} , я получу О'Брайан

Если я использую

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

Я понимаю О'Брайана

Оба выхода прерывают следующий код JSP в 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>

потому что он преобразуется в

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

или

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

Мне нужно было бы О'Брайан , чтобы сбежать как О \ 'Брайан

Есть идеи, как решить эту проблему?

РЕШЕНИЕ

Наиболее элегантные решения, кажется, используют простой тег.

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;
    }

}

Затем поместите в WEB-INF файл utils.tld:

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<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>

Тогда внутри вашего jsp:

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

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

Ответы [ 2 ]

3 голосов
/ 20 июня 2009

Вы можете определить новую функцию EL, которая экранирует строки для вас.

* 1003 Е.Г. *

В Java

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

В файле дескриптора библиотеки тегов:

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

Затем в вашем JSP (при условии, что вы включили .tld с префиксом 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>
1 голос
/ 19 июня 2009

Сохраните его как O'brian в базе данных, но перед отображением сделайте поиск вместо, чтобы преобразовать любое 'в \'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...