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

У меня есть шаблон 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, тогда я могу избежать добавления этой дополнительной переменной.

5 ответов

Решение

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

[#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>

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

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

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

Также я думаю, что 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?

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

<#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,

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

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

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
Другие вопросы по тегам