Como verificar se existe uma variável em um modelo FreeMarker?

175

Eu tenho um modelo Freemarker que contém um monte de espaços reservados para os quais os valores são fornecidos quando o modelo é processado. Quero incluir condicionalmente parte do modelo se a variável userName for fornecida, algo como:

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

No entanto, o manual do FreeMarker parece indicar que if_exists está obsoleto, mas não consigo encontrar outra maneira de conseguir isso. Obviamente, eu poderia simplesmente fornecer uma variável booleana adicional isUserName e usá-la assim:

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

Mas se existe uma maneira de verificar se o userName existe, posso evitar adicionar essa variável extra.

Dónal
fonte

Respostas:

304

Para verificar se o valor existe:

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

Ou com a sintaxe padrão do freemarker:

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

Para verificar se o valor existe e não está vazio:

<#if userName?has_content>
    Hi ${userName}, How are you?
</#if>
Ulf Lindback
fonte
1
Caso alguém mais se surpreenda com isso, a sintaxe #if deve ser cercada por caracteres menores e maiores que caracteres, em vez de colchetes. por exemplo: <#if userName ??>
Cameron
É realmente possível usar essa sintaxe, então apenas segui a sintaxe da pergunta: veja freemarker.sourceforge.net/docs/…
Ulf Lindback
10
Isso apenas verifica se o var existe. Mas se você tiver uma String vazia em "userName", o <#if userName ??> retornará true !! Consulte @ user1546081 resposta nesta página para solucionar esse problema.
Adrien Seja
94

Este parece ser um ajuste melhor:

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

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

user1546081
fonte
2
Parece verificar se o var existe E se seu conteúdo não é nulo ou vazio (consulte aqui Strings vazias).
Adrien Seja
4
É necessário diminuir o voto disso porque é tecnicamente incorreto e levará a um comportamento não intencional (falso negativo) se a variável existir (o que a operação queria verificar) mas estiver vazia.
Madbreaks
65

Também acho que if_exists foi usado como:

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

que não será interrompido se userName for nulo, o resultado se null for:

Hi , How are you?

if_exists agora está obsoleto e foi substituído pelo operador padrão! como em

Hi ${userName!}, How are you?

o operador padrão também suporta um valor padrão, como:

Hi ${userName!"John Doe"}, How are you?
Ulf Lindback
fonte
1
O operador de valor padrão não pode ser usado para avaliar um booleano. Como tal, ele não pode ser usado em uma ifdeclaração, como solicitado.
Madbreaks
5

Eu acho que muitas pessoas querem verificar se a variável não está vazia e se existe. Penso que verificar a existência e o vazio é uma boa ideia em muitos casos, e torna seu modelo mais robusto e menos propenso a erros tolos. Em outras palavras, se você verificar se sua variável não é nula E não está vazia antes de usá-la, seu modelo se torna mais flexível, porque você pode lançar uma variável nula ou uma string vazia nela, e funcionará da mesma maneira em ambos os casos.

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

Digamos que você queira ter certeza de que pé mais do que apenas espaço em branco. Então você pode apará-lo antes de verificar para ver se está has_content.

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

ATUALIZAR

Ignore minha sugestão - has_contenté tudo o que é necessário, pois faz uma verificação nula junto com a verificação vazia. Fazer p?? && p?has_contenté equivalente a p?has_content, então você também pode usar has_content.

Jake Toronto
fonte
2

Para versões anteriores ao FreeMarker 2.3.7

Você não pode usar ??para manipular valores ausentes, a sintaxe antiga é:

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