Bagaimana cara memeriksa apakah ada variabel dalam templat FreeMarker?

175

Saya memiliki template Freemarker yang berisi sekelompok placeholder yang nilainya diberikan saat template diproses. Saya ingin memasukkan bagian dari template jika variabel userName disediakan, seperti:

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

Namun, manual FreeMarker tampaknya menunjukkan bahwa if_exists sudah usang, tetapi saya tidak dapat menemukan cara lain untuk mencapai ini. Tentu saja, saya bisa menyediakan variabel boolean isUserName dan menggunakannya seperti ini:

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

Tetapi jika ada cara untuk memeriksa apakah userName ada maka saya dapat menghindari menambahkan variabel tambahan ini.

Dónal
sumber

Jawaban:

304

Untuk memeriksa apakah nilainya ada:

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

Atau dengan sintaks freemarker standar:

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

Untuk memeriksa apakah nilainya ada dan tidak kosong:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>
Ulf Lindback
sumber
1
Jika ada orang yang terlempar oleh ini, sintaksis #jika harus dikelilingi oleh kurang dari dan lebih besar dari karakter daripada kurung. misalnya: <#Jika userName ??>
Cameron
Sebenarnya mungkin untuk menggunakan sintaks ini, jadi saya hanya mengikuti sintaks dari pertanyaan: lihat freemarker.sourceforge.net/docs/…
Ulf Lindback
10
Ini hanya memeriksa apakah var ada. Tetapi jika Anda memiliki String kosong di "userName", <#jika userName ??> akan mengembalikan true !! Lihat @ user1546081 jawaban di halaman ini untuk mengatasi masalah ini.
Adrien Be
94

Yang ini tampaknya lebih cocok:

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

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

pengguna1546081
sumber
2
Tampaknya memeriksa apakah var ada DAN jika kontennya tidak nol atau kosong (merujuk ke String kosong di sini).
Adrien Be
4
Harus membatalkan ini karena secara teknis salah dan akan menyebabkan perilaku yang tidak diinginkan (negatif negatif) jika variabel ada (apa yang ingin diperiksa) tetapi kosong.
Madbreak
65

Juga saya pikir if_exists digunakan seperti:

Hi ${userName?if_exists}, How are you?

yang tidak akan rusak jika userName adalah null, hasilnya jika null adalah:

Hi , How are you?

if_exists sekarang sudah usang dan telah diganti dengan operator default! seperti dalam

Hi ${userName!}, How are you?

operator default juga mendukung nilai default, seperti:

Hi ${userName!"John Doe"}, How are you?
Ulf Lindback
sumber
1
Operator nilai default tidak dapat digunakan untuk mengevaluasi ke boolean. Dengan demikian, itu tidak dapat digunakan dalam ifpernyataan seperti yang diminta op.
Madbreak
5

Saya pikir banyak orang ingin dapat memeriksa untuk melihat apakah variabel mereka tidak kosong dan juga jika ada. Saya pikir memeriksa keberadaan dan kehampaan adalah ide yang bagus dalam banyak kasus, dan membuat templat Anda lebih kuat dan kurang rentan terhadap kesalahan konyol. Dengan kata lain, jika Anda memeriksa untuk memastikan variabel Anda tidak nol DAN tidak kosong sebelum menggunakannya, maka templat Anda menjadi lebih fleksibel, karena Anda bisa melempar variabel nol atau string kosong ke dalamnya, dan itu akan bekerja sama dalam kedua kasus.

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

Katakanlah Anda ingin memastikan bahwa pitu lebih dari sekadar spasi putih. Kemudian Anda bisa memotongnya sebelum memeriksa untuk melihat apakah itu has_content.

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

MEMPERBARUI

Abaikan saran saya - has_contenthanya itu yang diperlukan, karena ia melakukan cek nol bersama dengan cek kosong. Melakukannya p?? && p?has_contentsetara dengan p?has_content, jadi sebaiknya Anda gunakan saja has_content.

Jake Toronto
sumber
2

Untuk versi sebelum FreeMarker 2.3.7

Anda tidak dapat menggunakan ??untuk menangani nilai yang hilang, sintaks yang lama adalah:

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