Charge FreeMarker modèles à partir de la base de données
Je tiens à conserver ma FreeMarker modèles dans une table de base de données qui ressemble à quelque chose comme:
template_name | template_content
---------------------------------
hello |Hello ${user}
goodbye |So long ${user}
Lorsqu'une demande est reçue pour un modèle avec un nom particulier, ce qui devrait entraîner une requête à exécuter, qui charge de l'pertinentes modèle de contenu. Ce modèle de contenu, de concert avec le modèle de données (la valeur de l '"utilisateur" de la variable dans les exemples ci-dessus), doit ensuite être transmis à FreeMarker.
Cependant, la FreeMarker API semble supposer que chaque nom de modèle correspond à un fichier du même nom dans un répertoire particulier du système de fichiers. Est-il possible que je peux facilement avoir mes modèles chargé de la DB au lieu du système de fichiers?
EDIT: j'aurais dit que je voudrais être en mesure d'ajouter des modèles à la base de données pendant l'exécution de l'application, donc je ne peux pas il suffit de charger tous les modèles à démarrage dans une nouvelle StringTemplateLoader (comme suggéré ci-dessous).
Cheers,
Ne
Vous devez vous connecter pour publier un commentaire.
Nous utilisons un StringTemplateLoader pour charger nos tempates qui nous avons obtenu à partir de la db (Dan Vinton suggéré)
Voici un exemple:
Modifier
Vous n'avez pas à charger tous les modèles à démarrage. Chaque fois que nous allons accéder au modèle, nous allons chercher à partir de la DB et de la charge à travers le StringLoader et en appelant modèle.process() nous générons (dans notre cas) à la sortie XML.
Un couple de façons:
Créer une nouvelle mise en œuvre de TemplateLoader pour charger les modèles directement à partir de la base de données, et de le passer à votre Configuration instance à l'aide de
setTemplateLoader()
avant le chargement de tous les modèles.Utiliser un StringTemplateLoader que vous configurez à partir de votre base de données au démarrage de votre application. Ajouter à la configuration comme ci-dessus.
Modifier à la lumière de l'interlocuteur de la modifier, de votre propre implémentation de TemplateLoader ressemble à la manière d'aller. De vérifier la Javadoc ici, c'est une simple petite interface avec seulement quatre méthodes, et son comportement est bien documenté.
Depuis 2.3.20 vous pouvez simplement la construction d'un
Modèle
à l'aide d'une chaîne de:qui est une commodité constructeur de
Modèle(nom, nouveau StringReader(code source), cfg)
.Pour ceux qui recherchent un peu de code, c'est ici. Regardez les commentaires dans le code pour une meilleure compréhension.
DBTemplate:
TemplateLoader de mise en œuvre (EMF est une instance d'une EntityManagerFactory):
La configuration de l'installation en classe:
Et enfin, utiliser:
Cela fonctionne très bien, et vous permet d'utiliser la totalité de Freemarker fonctions importations, comprend, etc. Regardez les exemples suivants:
Ou dans:
- Je utiliser ce chargeur sur mon propre CMS (CinnamonFramework) et fonctionne comme un charme.
Mieux,
En œuvre de configuration.
Exemple :
}
Alors u peut l'utiliser comme ceci :