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

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

5 141

5 ответов:

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

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

<#if userName??>
   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?

который не сломается, если имя пользователя равно 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 - Это все, что необходимо, так как он выполняет проверку на null с пустой чек. Делать p?? && p?has_content эквивалентно p?has_content, так что вы можете также просто использовать has_content.

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

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

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