Как проверить, существует ли переменная в шаблоне FreeMarker?

175

У меня есть шаблон Freemarker, который содержит кучу заполнителей, для которых предоставляются значения при обработке шаблона. Я хочу условно включить часть шаблона, если указана переменная userName, что-то вроде:

[#if_exists userName]
  Hi ${userName}, How are you?
[/#if_exists]

Тем не менее, руководство FreeMarker, по-видимому, указывает, что if_exists устарело, но я не могу найти другого способа добиться этого. Конечно, я мог бы просто предоставить дополнительную логическую переменную isUserName и использовать ее следующим образом:

[#if isUserName]
  Hi ${userName}, How are you?
[/#if]

Но если есть способ проверить, существует ли userName, я могу избежать добавления этой дополнительной переменной.

Донал
источник

Ответы:

304

Чтобы проверить, существует ли значение:

[#if userName??]
   Hi ${userName}, How are you?
[/#if]

Или со стандартным синтаксисом freemarker:

<#if userName??>
   Hi ${userName}, How are you?
</#if>

Чтобы проверить, существует ли значение и не является ли оно пустым:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>
Ульф Линдбек
источник
1
В случае, если кто-то еще был сброшен этим, синтаксис #if должен быть заключен в символы меньше, чем и больше, чем скобки. например: <#if userName ??>
Кэмерон
На самом деле возможно использовать этот синтаксис, поэтому я просто следовал синтаксису вопроса: см. Freemarker.sourceforge.net/docs/…
Ulf Lindback
10
Это только проверка, существует ли var. Но если у вас есть пустая строка в «userName», <#if userName ??> вернет true !! См. @ User1546081 ответ на этой странице, чтобы решить эту проблему.
Адриен Бе
95

Этот, кажется, лучше подходит:

<#if userName?has_content>
... do something
</#if>

http://freemarker.sourceforge.net/docs/ref_builtins_expert.html

user1546081
источник
2
Кажется, чтобы проверить, существует ли переменная И, если ее содержимое не является нулевым или пустым (ссылаясь на пустые строки здесь).
Адриен Бе
4
Необходимо понизить это, потому что это технически некорректно и приведет к непреднамеренному (ложно отрицательному) поведению, если переменная существует (то, что операционная система хотела проверить), но пуста.
Madbreaks
65

Также я думаю, что if_exists был использован как:

Hi ${userName?if_exists}, How are you?

который не сломается, если userName имеет значение NULL, результат, если NULL будет:

Hi , How are you?

if_exists устарел и заменен оператором по умолчанию! как в

Hi ${userName!}, How are you?

Оператор по умолчанию также поддерживает значение по умолчанию, например:

Hi ${userName!"John Doe"}, How are you?
Ульф Линдбек
источник
1
Оператор значения по умолчанию нельзя использовать для вычисления логического значения. Как таковой, он не может быть использован в ifоператоре по запросу.
Madbreaks
5

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

<#if p?? && p?has_content>1</#if>

Допустим, вы хотите убедиться, что pэто больше, чем просто пробел. Затем вы можете обрезать его перед проверкой, чтобы увидеть, если это has_content.

<#if p?? && p?trim?has_content>1</#if>

ОБНОВИТЬ

Пожалуйста, не обращайте внимания на мое предложение - has_contentэто все, что нужно, так как он выполняет нулевую проверку вместе с пустой проверкой. Делать p?? && p?has_contentэквивалентно p?has_content, так что вы можете просто использовать has_content.

Джейк Торонто
источник
2

Для версий, предшествующих FreeMarker 2.3.7

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

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
Петер Фриберг
источник