Вывод JSTL сбежал?

Я получаю значение из нашей БД, используя JSTL. Я вставляю его прямо в какой-то javascript, чтобы использовать его как переменную. Мне нужно, чтобы вывод значения, которое JSTL удерживает, был экранирован, потому что, если есть одинарные или двойные кавычки, это нарушает мой сценарий. Значение задается пользователем.

Пример:

Делаем следующее:

<c:set var="myVar" value="Dale's Truck"/>

<script type="text/javascript">
    var mayVar = '${myVar}';
</script>

На самом деле это будет выглядеть так:

<script type="text/javascript">
    var mayVar = 'Dale's Truck';//extra single quote breaks the JS
</script>

Поэтому мне нужно преобразовать JSTL var, чтобы он был экранирован, как «Dale% 27s Truck», прежде чем он попадет в JS, потому что уже слишком поздно, когда он доберется до моего JS, чтобы сделать это в JS.


person UpHelix    schedule 15.07.2010    source источник


Ответы (2)


Попробуйте использовать fn:replace:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<c:set var="myVar" value="Dale's Truck" />
<c:set var="search" value="'" />
<c:set var="replace" value="%27" />

<c:set var="myVar" value="${fn:replace(myVar, search, replace)}"/>

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

<c:set var="replace" value="\\'" />

или если вы даже не хотите делать все это и уверены, что строка не будет содержать двойных кавычек, почему бы не сделать:

var myVar = "${myVar}"; //string enclosed with double quotes instead of single quotes

Но если в строке есть двойные кавычки, вам все равно нужно их экранировать:

<c:set var="search" value="\"" />
<c:set var="replace" value="\\\"" />
person Vivin Paliath    schedule 15.07.2010
comment
Это работает, спасибо! Я использовал двойную обратную косую черту вместо %27. - person UpHelix; 16.07.2010
comment
Никогда не пишите собственную экранирующую функцию! Потому что это БУДЕТ неправильно. Например, пример двойной обратной косой черты не работает для ввода a b \\'c. Он будет преобразован в \\', поэтому обратная косая черта будет экранирована, а одинарная кавычка завершит строку. Используйте существующие функции, которые проверены и отлажены, например. var x = '‹spring:escapeBody htmlEscape=false javaScriptEscape=true›${myVar}‹/spring:escapeBody›'; - person David Balažic; 29.01.2016

Другой ответ уже был принят, но Давид Балазич сделал важное замечание. Функция <spring:escapeBody> работает лучше всего.

<spring:escapeBody htmlEscape="false" javaScriptEscape="true">${myVar}</spring:escapeBody>

person Anthony Chuinard    schedule 04.06.2016