web-dev-qa-db-ja.com

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]

しかし、userNameが存在するかどうかを確認する方法があれば、この余分な変数を追加するのを避けることができます。

156
Dónal

値が存在するかどうかを確認するには:

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

または、標準のfreemarker構文を使用します。

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

値が存在し、空でないかどうかを確認するには:

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

これはより適しているようです:

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

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

91
user1546081

また、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?
63
Ulf Lindback

多くの人が、変数が空でないかどうか、また変数が存在するかどうかを確認できるようにしたいと考えています。多くの場合、存在と空をチェックすることは良い考えであり、テンプレートをより堅牢にし、愚かなエラーを起こしにくいと思います。つまり、使用する前に変数がnullではなく空でもないことを確認すると、null変数または空の文字列をスローできるため、テンプレートはより柔軟になり、同じように機能しますどちらの場合にも。

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

pが単なる空白以上であることを確認したいとしましょう。その後、has_contentであるかどうかを確認する前に、それをトリミングできます。

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

UPDATE

私の提案を無視してください-has_contentが必要なのは、空のチェックとともにnullチェックを行うからです。 p?? && p?has_contentを実行することはp?has_contentと同等であるため、単にhas_contentを使用することもできます。

3
Jake Toronto

FreeMarker 2.3.7より前のバージョンの場合

??を使用して欠損値を処理することはできません。古い構文は次のとおりです。

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