¿Cómo verificar si existe una variable en una plantilla de FreeMarker?

175

Tengo una plantilla de Freemarker que contiene un montón de marcadores de posición para los que se proporcionan valores cuando se procesa la plantilla. Quiero incluir condicionalmente parte de la plantilla si se proporciona la variable userName, algo así como:

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

Sin embargo, el manual de FreeMarker parece indicar que if_exists está en desuso, pero no puedo encontrar otra forma de lograrlo. Por supuesto, podría simplemente proporcionar una variable booleana adicional isUserName y usarla así:

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

Pero si hay una manera de verificar si userName existe, entonces puedo evitar agregar esta variable adicional.

Dónal
fuente

Respuestas:

304

Para verificar si el valor existe:

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

O con la sintaxis estándar de marcador libre:

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

Para verificar si el valor existe y no está vacío:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>
Ulf Lindback
fuente
1
En caso de que alguien más se haya desanimado por esto, la sintaxis #if debe estar rodeada por caracteres menores y mayores que caracteres entre paréntesis. por ejemplo: <#if userName ??>
Cameron
En realidad es posible usar esta sintaxis, así que acabo de seguir la sintaxis de la pregunta: ver freemarker.sourceforge.net/docs/…
Ulf Lindback
10
Esto solo verifica si la var existe. ¡Pero si tiene una cadena vacía en "userName", el <#if userName ??> devolverá verdadero! Consulte la respuesta @ user1546081 en esta página para abordar este problema.
Adrien Be
94

Este parece encajar mejor:

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

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

usuario1546081
fuente
2
Parece verificar si la var existe Y si su contenido no es nulo o está vacío (refiriéndose a las cadenas vacías aquí).
Adrien Be
44
Tiene que rechazar esto porque es técnicamente incorrecto y dará lugar a un comportamiento no deseado (falso negativo) si la variable existe (lo que el operador quería verificar) pero está vacía.
Madbreaks
65

También creo que if_exists se usó como:

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

que no se romperá si userName es nulo, el resultado si nulo sería:

Hi , How are you?

¡if_exists ahora está en desuso y ha sido reemplazado por el operador predeterminado! como en

Hi ${userName!}, How are you?

el operador predeterminado también admite un valor predeterminado, como:

Hi ${userName!"John Doe"}, How are you?
Ulf Lindback
fuente
1
El operador de valor predeterminado no se puede usar para evaluar un valor booleano. Como tal, no se puede usar en una ifdeclaración según lo solicitado.
Madbreaks
5

Creo que muchas personas quieren poder verificar si su variable no está vacía y si existe. Creo que verificar la existencia y el vacío es una buena idea en muchos casos, y hace que su plantilla sea más robusta y menos propensa a errores tontos. En otras palabras, si verifica para asegurarse de que su variable no sea nula Y no esté vacía antes de usarla, entonces su plantilla se vuelve más flexible, porque puede arrojar una variable nula o una cadena vacía, y funcionará igual en cualquier caso.

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

Digamos que quiere asegurarse de que psea ​​más que solo un espacio en blanco. Luego puede recortarlo antes de verificar si está has_content.

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

ACTUALIZAR

Ignore mi sugerencia: has_contentes todo lo que se necesita, ya que hace un cheque nulo junto con el cheque vacío. Hacer p?? && p?has_contentes equivalente a p?has_content, por lo que también puedes usarlo has_content.

Jake Toronto
fuente
2

Para versiones anteriores a FreeMarker 2.3.7

No puede usar ??para manejar valores perdidos, la sintaxis anterior es:

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