Как проверить, существует ли переменная в шаблоне 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]

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

Ответ 1

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

UPDATE

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