Обробка нульових значень у Freemarker


Відповіді:


98

Ви можете використовувати ??тестовий оператор:

Це перевіряє, чи не є атрибут об’єкта нульовим:

<#if object.attribute??></#if>

Це перевіряє, чи не є об'єкт або атрибут нульовим:

<#if (object.attribute)??></#if>

Джерело: Посібник FreeMarker


1
У чому різниця між цим підходом та вмістом has_content ??
Ананд Б

3
has_content, поруч із перевіркою нуля, також перевіряє, чи не є значення порожнім. Це працює для рядків, послідовностей, хешів або колекцій. Якщо об’єктом є дата, логічне значення або число, тоді він діє як непустий. Для всіх інших типів він буде діяти як порожній.
Том Верельст,

У мене ця проблема, коли мені потрібно перевірити, чи значення в bean є нульовим. Я спробував наступне: $ {checknull (Bean.getValue ())}, де checknull, якщо функція <# function checknull x> <#if x? ?> <#return ""> <#else> <#return x> </ # if> </ # function>, але я отримую "Помилка при виконанні макросу: checknull необхідний параметр: x не вказано." помилка
Ананд Б

Потрібно повернути повернення: <# function checknull x> <#if x ??> <#return x> <#else> <#return ""> </ # if> </ # function>
Tom Verelst

1
Будь ласка, перевірте відповідь нижче: stackoverflow.com/a/27614219/3002336
Anand Varkey Philips

106

Починаючи з Freemarker 2.3.7, ви можете використовувати такий синтаксис :

${(object.attribute)!}

або, якщо потрібно відобразити текст за замовчуванням, коли атрибут null:

${(object.attribute)!"default text"}

1
Для тих, хто використовує Freemarker як механізм шаблонів для XDocReport, це працює після додавання <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.22</version></dependency>до вашого pom.xml.
Людовик Гійом

Як це зробити, якщо у вас є дата, і дата може бути нульовою? Іншими словами, object.dateAcquired, де dateAcquired може бути нульовим, і у вас є $ {object.dateAcquired? Date}
Стефан Греньє,

1
@StephaneGrenier use${(object.dateAcquired?date)!"not present"}
Tassos Bassoukos

1
Чудовий приклад. Мені дуже допомогло. Кронштейн, однак, застарілий. ${salutation!'Dear Mr. or Mrs.'}
Sim0rn

Будь-яка ідея, як я можу друкувати .now? Long за значенням за замовчуванням?
Сантьяго Асеньолаза

4

Я думаю, це працює в інший бік

<#if object.attribute??>
   Do whatever you want....
</#if>

Якщо object.attributeзначення НЕ НУЛЕВО, вміст буде надруковано.


1

Використовуйте ??оператор у кінці <#if>виписки.

Цей приклад демонструє, як обробляти nullзначення для двох списків у шаблоні Freemaker.

List of cars:
<#if cars??>
    <#list cars as car>${car.owner};</#list>
</#if>
List of motocycles:
<#if motocycles??>
    <#list motocycles as motocycle>${motocycle.owner};</#list>
</#if>

-3

Якщо у вас є багато змінних для перетворення в необов’язкові, ви можете використовувати SubimeText з цим:

Find: \${([A-Za-z_0-9]*)}
Replace: \$\{${1}!\}

Переконайтеся, що ввімкнено параметри регулярного виразу та регістру:

Замінити піднесений регулярний вираз

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