web-dev-qa-db-fra.com

Comment sortir $ {expression} dans Freemarker sans qu'il soit interprété?

J'essaie d'utiliser Freemarker en conjonction avec les modèles jQuery.

Les deux cadres utilisent des signes dollar/accolades pour identifier les expressions à substituer (ou comme elles sont appelées dans freemarker, "interpolations"), par exemple. ${person.name}.

Ainsi, lorsque je définis un modèle jQuery avec des expressions dans cette syntaxe, Freemarker tente de les interpréter (et échoue).

J'ai essayé diverses combinaisons d'échapper à la séquence ${ pour la passer par Freemarker en vain - \${, \$\{, $\{, etc.

Insérer un commentaire de marque de commerce entre le dollar et le bouclé (par exemple, $<#-- -->{expression}) fonctionne, mais je recherche une solution plus concise et élégante.

Existe-t-il un moyen plus simple d'obtenir un modèle Freemarker pour générer la séquence de caractères ${?

26
Glenn Barnett

Cela devrait imprimer $ {person.name}:

${r"${person.name}"}
48
javanna

De même, si vous avez des sections plus longues sans marquage FreeMarker, vous pouvez utiliser <#noparse>...</#noparse>.

Si vous rencontrez beaucoup de problèmes, depuis FreeMarker 2.3.28, vous pouvez configurer FreeMarker pour qu'il utilise [=exp] au lieu de ${exp}, en définissant le paramètre de configuration interpolation_syntax sur square_bracket (dans l'API Java: Configuration cfg; ... cfg.setInterpolationSyntax(Configuration.SQUARE_BRACKET_INTERPOLATION_SYNTAX)). Alors ${exp} est juste un texte statique pour FreeMarker. Ne confondez pas ce paramètre avec le paramètre tag_syntax, qui peut également avoir la valeur square_bracket, mais est indépendant de la syntaxe d'interpolation (mais vous pouvez préférer définir les deux sur square_bracket). Voir aussi: https://freemarker.Apache.org/docs/dgui_misc_alternativesyntax.html

20
ddekany

Une autre option consiste à utiliser #include avec l'option parse = false. Autrement dit, placez vos modèles jQuery dans la page d'inclusion distincte et utilisez parse = false afin que freemarker n'essaye pas de l'analyser.

Ce serait une bonne option lorsque les modèles sont plus grands et contiennent des guillemets doubles. 

4
Rob Bygrave

Si ${ est votre seul problème, vous pouvez utiliser la syntaxe alternative dans le plug-in jQuery Templates comme ceci: {{= person.name}} 

Peut-être un peu plus propre que d'y échapper.

3
RP Niemeyer

Avez-vous essayé $$?

J'ai trouvé dans le manuel de Freemarker que ${r"${person.name}"} va imprimer ${person.name} sans essayer de le rendre.

Peut-être devriez-vous également jeter un œil à Freemarker s'échappant de freemarker

1
adarshr

J'ai dû passer du temps à comprendre les scénarios suivants pour échapper à $ {expression} - 

  • En mission Freemarker:

<#assign var = r "$ {expression}">

  • Dans l'attribut html:

<a href="/user/${r"${expression}"}"> Some link </a>

  • Dans la concaténation Freemarker:

<#assign x = "quelque chose &" + r "$ {expression}" />

1
Rahul Tiwari

Je peux confirmer que le 

${r"${item.id}"}

est la bonne façon à titre d'exemple.

Donc, je vais avoir un exemple assez complet

<span><a href="/user/user-remove/${r"${item.id}"}"> Remove </a></span>

et le résultat sera:

<span><a href="/user/user-remove/${item.id}"> Remove </a></span>
0
JOKe

Si vous souhaitez utiliser des chaînes non brutes pour pouvoir échapper aux guillemets, aux apostrophes, etc., vous pouvez procéder comme suit:

Imaginez que vous souhaitiez utiliser la chaîne $ {Hello} - "Ami de mon ami" à l'intérieur d'une chaîne. Vous ne pouvez pas faire cela avec des chaînes brutes. Ce que j'ai utilisé qui fonctionne est:

${"\x0024{Hello}-\"My friend's friend\""}

Je n'ai pas échappé à l'apostrophe puisque j'ai utilisé les guillemets doubles.

0
Jaime Garza