Re: JSP, Строка со спецсимволами
От: cy6erGn0m Россия  
Дата: 12.09.08 08:06
Оценка: 3 (1)
Здравствуйте, leokom, Вы писали:

L>Возникла задача на jsp-странице вывести confirm с вопросом "хотите ли вы действительно удалить объект с именем <aaa>"


L>Проблема в том что имя aaa может содержать спецсимволы (' или ") и они ломают джаваскрипт.

L>Я не вижу способа как вообще в таком случае записать валидный джаваскрипт:

L>1)

L>var object_name = "${objectName}" или
L>var object_name = '${objectName}' НЕ ПОДХОДЯТ, т.к.
L>${objectName} может хранить и апострофы и кавычки и другое. Поэтому

L>видимо необходимо передавать уже форматтированную строчку с сервера.

L>Понадеялся на тег <c:out escapeXml="true">

L>но к сожалению он заменяет < -> &lt; & -> &amp; а

L>вот кавычки и апострофы игнорирует

L>Кто-нибудь знает хорошее решение (наверное тег)? В бизнес-логику форматирование для презентейшна не хотелось бы забивать.


L>Заранее спасибо!


Есть теги для этого. Например, в Apache commons есть JSP-функции для этого. Там есть теги для всяких разных вариаций. Я поленился тащить всю апачевскую библиотеку и написал просто JSP-функцию.

Я написал следующее:



public class JspStringsEscaper {
    public static final String escapeJsString( Object o ) {
        if( o == null )
            return "";
        char[] input = o.toString().toCharArray();
        StringBuffer sb = new StringBuffer(input.length << 1);
        for( char ch : input ) {
            if( ch > 0xfff ) {
                sb.append( "\\u" );
                sb.append( Integer.toHexString(ch) );
            } else if( ch < 32 ) {
                switch(ch) {
                    case '\b':
                        sb.append( "\\b" );
                        break;
                    case '\n':
                        sb.append( "\\n" );
                        break;
                    case '\r':
                        sb.append( "\\r" );
                        break;
                    default:
                        if( ch > 0xf ) 
                            sb.append( "\\u00" + Integer.toHexString(ch) );
                        else
                            sb.append( "\\u000" + Integer.toHexString(ch) );
                }
            } else {
                switch(ch) {
                    case '\'':
                        sb.append( "\\'" );
                        break;
                    case '"':
                        sb.append( "\\\"" );
                        break;
                    default:
                        sb.append(ch);
                }
            }
        }
        return sb.toString();
    }
}


и оформил функцию


<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>functions</short-name>
  <uri>/WEB-INF/tlds/functions</uri>
  
   <function>
       <name>escapeJsString</name>
       <function-class>*********.JspStringsEscaper</function-class>
       <function-signature>java.lang.String escapeJsString( java.lang.Object )</function-signature>
   </function>
</taglib>



на странице пользую так:

включить за префиксом f
<%@ taglib prefix="f" uri="/WEB-INF/tlds/functions.tld" %>


и использование само
'${f:escapeJsString(test.errorMessage)}',
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.