Come verificare se esiste una variabile in un modello FreeMarker?


175

Ho un modello Freemarker che contiene un gruppo di segnaposto per i quali vengono forniti valori quando il modello viene elaborato. Voglio includere condizionalmente parte del modello se viene fornita la variabile userName, qualcosa del tipo:

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

Tuttavia, il manuale di FreeMarker sembra indicare che if_exists è obsoleto, ma non riesco a trovare un altro modo per raggiungere questo obiettivo. Certo, potrei semplicemente fornire un'ulteriore variabile booleana isUserName e usarla in questo modo:

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

Ma se c'è un modo per verificare se esiste UserName, posso evitare di aggiungere questa variabile aggiuntiva.

Risposte:


304

Per verificare se il valore esiste:

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

O con la sintassi standard dei freemarker:

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

Per verificare se il valore esiste e non è vuoto:

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

1
Nel caso in cui qualcun altro fosse scacciato da questo, la sintassi #if dovrebbe essere racchiusa tra meno e maggiore di caratteri anziché tra parentesi. per esempio: <#if userName ??>
Cameron

In realtà è possibile utilizzare questa sintassi, quindi ho appena seguito la sintassi della domanda: vedi freemarker.sourceforge.net/docs/…
Ulf Lindback

10
Questo controlla solo se il var esiste. Ma se hai una stringa vuota in "userName", <#if userName ??> restituirà true !! Vedi @ user1546081 risposta in questa pagina per risolvere questo problema.
Adrien, il

94

Questo sembra adattarsi meglio:

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

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


2
Sembra verificare se il var esiste E se il suo contenuto non è nullo o vuoto (facendo riferimento a stringhe vuote qui).
Adrien, il

4
È necessario ridimensionarlo perché è tecnicamente errato e porterà a un comportamento involontario (falso negativo) se la variabile esiste (ciò che op ha voluto verificare) ma è vuota.
Madbreaks

65

Inoltre penso che if_exists sia stato usato come:

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

che non si interromperà se userName è null, il risultato se null sarebbe:

Hi , How are you?

if_exists è ora obsoleto ed è stato sostituito con l'operatore predefinito! come in

Hi ${userName!}, How are you?

l'operatore predefinito supporta anche un valore predefinito, ad esempio:

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

1
L'operatore valore predefinito non può essere utilizzato per valutare un valore booleano. Come tale, non può essere utilizzato in ifun'istruzione come richiesto da op.
Madbreaks

5

Penso che molte persone vogliano essere in grado di verificare se la loro variabile non è vuota e se esiste. Penso che verificare l'esistenza e il vuoto sia una buona idea in molti casi e rende il modello più robusto e meno soggetto a errori sciocchi. In altre parole, se controlli per assicurarti che la tua variabile non sia nulla E non sia vuota prima di usarla, allora il tuo modello diventa più flessibile, perché puoi lanciare una variabile nulla o una stringa vuota, e funzionerà allo stesso modo in ogni caso.

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

Diciamo che vuoi assicurarti che non psia solo uno spazio bianco. Quindi potresti tagliarlo prima di controllare per vedere se has_content.

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

AGGIORNARE

Si prega di ignorare il mio suggerimento: has_contentè tutto ciò che è necessario, in quanto esegue un controllo null insieme al controllo vuoto. Fare p?? && p?has_contentequivale a p?has_content, quindi puoi anche solo usare has_content.


2

Per versioni precedenti a FreeMarker 2.3.7

Non è possibile utilizzare ??per gestire i valori mancanti, la vecchia sintassi è:

<#if userName?exists>
   Hi ${userName}, How are you?
</#if>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.