Как вывести $ {expression} во Freemarker без его интерпретации? - PullRequest
28 голосов
/ 06 марта 2011

Я пытаюсь использовать Freemarker в сочетании с шаблонами jQuery.

Обе структуры используют знак доллара / фигурные скобки для определения выражений для подстановки (или, как их называют в freemarker, «интерполяции»), например, ${person.name}.

Поэтому, когда я определяю шаблон jQuery с выражениями в этом синтаксисе, Freemarker пытается их интерпретировать (и терпит неудачу).

Я пробовал различные комбинации экранирования последовательности ${, чтобы пропустить ее через Freemarker безрезультатно - \${, \$\{, $\{ и т. Д.

Вставка комментария свободного маркера между долларом и фигурным (например, $<#-- -->{expression}) работает, но я ищу более краткое и элегантное решение.

Есть ли более простой способ получить шаблон Freemarker для вывода последовательности символов ${?

Ответы [ 8 ]

51 голосов
/ 06 марта 2011

Это должно вывести $ {person.name}:

${r"${person.name}"}
22 голосов
/ 05 августа 2011

Для более длинных разделов без разметки FreeMarker используйте <#noparse>...</#noparse>.

Начиная с FreeMarker 2.3.28, настройте FreeMarker для использования синтаксиса в квадратных скобках ([=exp]) вместо синтаксиса скобок (${exp}) с помощьюустановка параметра конфигурации interpolation_syntax на square_bracket.

Обратите внимание, что в отличие от синтаксиса тега , синтаксис интерполяции не может быть указан внутри шаблона.Изменение синтаксиса интерполяции требует вызова API Java:

Configuration cfg;
// ...
cfg.setInterpolationSyntax(SQUARE_BRACKET_INTERPOLATION_SYNTAX);

Тогда FreeMarker будет считать ${exp} статическим текстом.

Не путайте интерполяциюсинтаксис с синтаксисом тега, который также может иметь значение square_bracket, но не зависит от синтаксиса интерполяции.

При использовании PreProcessor на основе FreeMarker (FMPP), либо настроитьустановка через config.fmpp или в командной строке, например:

fmpp --verbose --interpolation-syntax squareBracket ...

Это вызовет соответствующий API Java перед обработкой файла.

См. также:

4 голосов
/ 01 августа 2011

Другой вариант - использовать #include с параметром parse = false.То есть поместите ваши шаблоны jQuery на отдельную страницу включения и используйте parse = false, чтобы freemarker не пытался их проанализировать.

Это было бы хорошим вариантом, если шаблоны больше и содержат двойные кавычки.

3 голосов
/ 06 марта 2011

Если ${ является вашей единственной проблемой, то вы можете использовать альтернативный синтаксис в плагине jQuery Templates, например: {{= person.name}}

Возможно, немного чище, чем избежать его.

1 голос
/ 14 декабря 2018

Мне пришлось потратить некоторое время, чтобы выяснить следующие сценарии, чтобы избежать $ {expression} -

  • В назначении Freemarker:

<# assignvar = r "$ {expression}">

  • В атрибуте html:

<a href="/user/${r"${expression}"}"> Some link </a>

  • В конкатенации Freemarker:

<# assign x = "что-то &" + r "$ {expression}" />

1 голос
/ 06 марта 2011

Вы пробовали $$?

Я обнаружил в руководстве Freemarker, что ${r"${person.name}"} напечатает ${person.name}, не пытаясь его отрендерить.

Возможно, вам стоит взглянуть на Freemarker, выходящий из freemarker

0 голосов
/ 03 ноября 2015

Я могу подтвердить, что

${r"${item.id}"}

является верным способом в качестве примера.

Так что я в некотором роде полный пример будет выглядеть так:вывод будет:

<span><a href="/user/user-remove/${item.id}"> Remove </a></span>
0 голосов
/ 15 января 2014

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

Представьте, что вы хотите использовать строку $ {Hello} - "Друг моего друга" внутри строки. Вы не можете сделать это с необработанными строками. То, что я использовал, это работает:

${"\x0024{Hello}-\"My friend's friend\""}

Я не избежал апострофа, так как использовал двойные кавычки.

...