Як перевірити, чи існує змінна в шаблоні 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]

Або зі стандартним синтаксисом фрімаркера:

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

Щоб перевірити, чи значення існує та чи не порожнє:

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

1
У випадку, якщо хтось інший був відкинутий цим, синтаксис #if повинен бути оточений меншими та більшими символами, а не дужками. наприклад: <#if userName ??>
Cameron

Це насправді можна використовувати цей синтаксис, так що я просто слідував синтаксису питання: см freemarker.sourceforge.net/docs / ...
Ulf Lindback

10
Це лише перевірити, чи існує var. Але якщо у "userName" у вас порожній рядок, <#if userName ??> повернеться правдою !! Дивіться @ user1546081 відповідь на цій сторінці, щоб вирішити цю проблему.
Adrien Be

94

Цей, здається, більше підходить:

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

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


2
Здається, перевіряє, чи існує var, І чи вміст його недійсний чи порожній (звертаючись до порожніх рядків тут).
Адрієн Бе

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.