2008-11-20 16 views
135

Tengo una plantilla de Freemarker que contiene un grupo 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 suministra la variable userName, algo así como:¿Cómo comprobar si existe una variable en una plantilla de FreeMarker?

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

Sin embargo, el manual FreeMarker parece indicar que if_exists está en desuso, pero no puedo encontrar otra manera de lograr este . Por supuesto, podría proporcionar una sencilla isUserName variable booleana adicional y el uso que de esta manera:

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

Pero si hay una manera de comprobar si existe nomUsuario entonces puedo evitar la adición de esta variable adicional.

Respuesta

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

O con la sintaxis FreeMarker estándar:

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

En caso de que alguien más haya sido expulsado por esto, la sintaxis #if debería estar rodeada de caracteres menores que y mayores que los corchetes. por ejemplo: <#if userName?> – Cameron

+0

En realidad es posible usar esta sintaxis, así que simplemente seguí la sintaxis de la pregunta: ver http://freemarker.sourceforge.net/docs/dgui_misc_alternativesyntax.html –

+9

This only compruebe si existe la var. Pero si tiene un String vacío en "userName", el <#if userName ??> ¡devolverá true! Consulte @ user1546081 respuesta en esta página para solucionar este problema. –

55

También pienso if_exists se utilizó como:

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

que no se romperá si nombre de usuario es nulo, el resultado si nulo sería:

Hi , How are you? 

if_exists ahora está en desuso y se ha reemplazado con el operador predeterminado. como en

Hi ${userName!}, How are you? 

el operador por defecto también es compatible con un valor por defecto, como por ejemplo:

Hi ${userName!"John Doe"}, How are you? 
+12

sintaxis freaky ... – skaffman

+0

El operador de valor predeterminado no se puede usar para evaluar a un booleano. Como tal, no se puede usar en una declaración 'if' como op solicitada. – Madbreaks

84

Éste parece ser un mejor ajuste:

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

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

+2

Parece que verifica si la var existe Y si su contenido no es nulo o está vacío (refiriéndose a las cadenas vacías aquí). –

+4

Tengo que rechazar esto porque es técnicamente incorrecto y dará lugar a un comportamiento involuntario (falso negativo) si la variable * existe * (lo que op quería verificar) pero está vacía. – Madbreaks

2

I Creo que mucha gente quiere poder verificar si su variable no está vacía como w ell como si existiera. Creo que comprobar la existencia y el vacío es una buena idea en muchos casos, y hace que tu plantilla sea más robusta y menos propensa a errores tontos. En otras palabras, si comprueba que su variable no es 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 en ella, y funcionará igual en cualquier caso.

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

Digamos que usted quiere asegurarse de que p es algo más que un espacio en blanco. Luego puede recortarlo antes de verificar si es has_content.

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

ACTUALIZACIÓN

Por favor, ignore mi sugerencia - has_content es todo lo que se necesita, como lo hace un cheque nulo junto con la verificación vacía. Hacer p?? && p?has_content es equivalente a p?has_content, por lo que también puede usar has_content.

Cuestiones relacionadas