web-dev-qa-db-fra.com

Comment vérifier si une variable existe dans un modèle FreeMarker?

J'ai un modèle Freemarker qui contient un groupe de paramètres de substitution pour lesquels des valeurs sont fournies lors du traitement du modèle. Je veux inclure de manière conditionnelle une partie du modèle si la variable userName est fournie, quelque chose comme:

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

Cependant, le manuel de FreeMarker semble indiquer que if_exists est obsolète, mais je ne trouve pas d'autre moyen d'y parvenir. Bien sûr, je pourrais simplement fournir une variable booléenne supplémentaire isUserName et l'utiliser comme ceci:

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

Mais s'il existe un moyen de vérifier si userName existe, je peux éviter d'ajouter cette variable supplémentaire.

161
Dónal

Pour vérifier si la valeur existe:

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

Ou avec la syntaxe standard de freemarker:

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

Pour vérifier si la valeur existe et n'est pas vide:

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

Celui-ci semble être un meilleur ajustement:

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

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

92
user1546081

Aussi, je pense que if_exists a été utilisé comme:

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

qui ne sera pas cassé si userName est null, le résultat si null serait:

Hi , How are you?

if_exists est maintenant obsolète et a été remplacé par l'opérateur par défaut! un péché

Hi ${userName!}, How are you?

l'opérateur par défaut prend également en charge une valeur par défaut, telle que:

Hi ${userName!"John Doe"}, How are you?
63
Ulf Lindback

Je pense que beaucoup de gens veulent pouvoir vérifier si leur variable n'est pas vide aussi bien que si elle existe. Je pense que la vérification de l'existence et du vide est une bonne idée dans de nombreux cas et rend votre modèle plus robuste et moins sujet aux erreurs idiotes. En d'autres termes, si vous vérifiez que votre variable n'est pas null AND vide avant de l'utiliser, votre modèle devient alors plus flexible, car vous pouvez y insérer une variable null ou une chaîne vide, et le fonctionnement sera le même. dans tous les cas.

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

Supposons que vous souhaitiez vous assurer que p ne se limite pas aux espaces. Ensuite, vous pouvez le rogner avant de vérifier si has_content.

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

UPDATE

Ignorez s'il vous plaît ma suggestion - has_content est tout ce qui est nécessaire, car il effectue un contrôle nul en même temps que le contrôle vide. Faire p?? && p?has_content équivaut à p?has_content, vous pouvez donc également utiliser has_content.

3
Jake Toronto

Pour les versions antérieures à FreeMarker 2.3.7

Vous ne pouvez pas utiliser ?? pour traiter les valeurs manquantes, l'ancienne syntaxe est la suivante:

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