Как примечание, одна из вещей, о которых вам нужно беспокоиться при использовании JSP для генерации Javascript, это то, что из коробки не предусмотрено средства для «санации» текста для этого контекста.В частности, в этом примере, если вы хотите поместить ${entry.value}
в строку Javascript:
var someValue = '${entry.value}';
, вы должны убедиться, что значение будет правильно проанализировано как строка Javascript.Что определенно НЕ будет работать:
var someValue = '${fn:escapeXml(entry.value)}';
Почему бы и нет?Потому что fn:escapeXml()
предназначен для очистки строк, чтобы синтаксический анализатор XML или HTML не видел метасимволов в строках.У XML и HTML есть свои особенности, и они просто полностью отличаются от синтаксиса Javascript.Например, амперсанд внутри строковой константы Javascript - это просто амперсанд.Однако в нашем примере здесь, если ${entry.value}
- это имя вашего ирландского дяди, то при расширении у нас будет:
var someValue = 'John O'Hara';
, и это синтаксическая ошибка Javascript.
Длянасколько мне известно, в JSTL / EL еще нет стандартизированного преобразователя JSON.Захват одного из множества доступных наборов инструментов JSON (все со своими плюсами и минусами) и привязка его к собственной функции EL - один из подходов к решению этой проблемы.Другой, более простой подход - просто написать свой собственный вариант fn:escapeXml()
с целью «экранирования» строк Javascript.Следует беспокоиться о кавычках, семействе специальных управляющих символов, таких как символы новой строки и возврата, символ обратной косой черты и символы Юникода вне 7-битного диапазона.С этим можно спокойно написать:
var someValue = '${yourTld:escapeJS(entry.value)}';
и быть уверенным, что сгенерированный текст будет выглядеть примерно так:
var someValue = 'John O\'Hara';