Здравствуйте, 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>но к сожалению он заменяет < -> < & -> & а
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)}',