Maison  >  Article  >  php教程  >  Disposition FreeMarker (Configuration)

Disposition FreeMarker (Configuration)

高洛峰
高洛峰original
2017-01-05 13:25:362183parcourir

p>Bases

La configuration est un objet qui stocke les informations de configuration publique au niveau de l'application et les variables globales partagées qui peuvent être utilisées par les modèles. Parallèlement, il est également responsable de la création et de la mise en cache des instances de modèles. Une configuration est en fait une instance de l'objet freemarker.template.Configuration, créée à l'aide de son constructeur. En règle générale, les applications utilisent un objet de configuration partagé à instance unique.

Les objets Configuration peuvent être utilisés par les méthodes de l'objet Template. Chaque instance de modèle est associée à une instance de configuration, qui est associée via le constructeur Template. Habituellement, vous utilisez cette méthode pour obtenir l'objet Configuration.getTemplate Template.

Variables partagées

Les variables partagées sont les variables définies pour être utilisées par tous les modèles. Vous pouvez ajouter des variables partagées via la méthode setSharedVariable de l'objet de configuration.

Configuration cfg = new Configuration(); ... cfg.setSharedVariable("wrap", new WrapDirective()); cfg.setSharedVariable("company", "Foo Inc."); .DEFAULT_WRAPPER

Toutes les instances de modèle associées à l'objet de configuration peuvent obtenir la chaîne en obtenant le convertisseur to_upper et la société, vous n'avez donc pas besoin d'ajouter ces variables à la racine encore et encore. Si vous ajoutez une variable du même nom à la racine, la variable nouvellement ajoutée écrasera la variable partagée précédente.

Attention !

Si l'objet de configuration est appelé par plusieurs threads, n'utilisez pas les classes d'implémentation TemplateModel comme variables partagées car elles ne sont pas thread-safe, comme les sites Web basés sur des servlets.

L'objet de configuration contient déjà des variables de convertisseur partagées lors de son initialisation :

name class

name class capture_output freemarker.template.utility.CaptureOutput compress freemarker.template.utility.StandardCompress html_escape freemarker.template.utility.HtmlEscape normalize_newlines freemarker.template.utility.NormalizeNewlines xml_escape freemarker.template.utility.XmlEscape

Paramètres de configuration

Les paramètres de configuration sont ceux nommés qui peuvent affecter le comportement d'exécution de FreeMarker paramètre. Par exemple locale,number_format.

Les paramètres de configuration sont stockés dans l'instance de configuration, qui peut être modifiée par l'instance de modèle (Template). Par exemple, si vous définissez les paramètres régionaux sur « en_US » dans Configuration, tous les objets de modèle utiliseront « en_US », sauf si vous modifiez la configuration par défaut à l'aide de la méthode setLocale dans une seule instance de modèle. Par conséquent, les paramètres définis par la configuration peuvent être considérés comme les paramètres par défaut, qui peuvent être remplacés par les paramètres définis par le niveau Modèle, et les informations sur les paramètres définies par eux peuvent être écrasées par les paramètres définis dans l'environnement (c'est-à-dire défini par les instructions du fichier modèle) Comme suit :

${1.2}<#setting locale="en_US">${1.2}

Vous pouvez imaginer cette méthode d'appel comme trois couches (couche d'objet de configuration, couche de modèle, couche d'environnement d'exécution) Le tableau suivant présente les paramètres de chaque couche :

Paramètre A Paramètre B Paramètre C Paramètre D Paramètre E Paramètre F Couche 3 : Environnement 1 - - 1 - - Couche 2 : Modèle 2 2 - - 2 - Couche 1 : Configuration 3 3 3 3 - -

Ensuite, les résultats finaux des paramètres de configuration sont : A = 1, B = 2, C = 3, D = 1, E = 2. Le paramètre F est susceptible d'être nul.

Si vous souhaitez interroger la liste des paramètres paramétrables, vous pouvez consulter les deux parties suivantes de la documentation de l'API FreeMarker :
Configuration de toutes les couches

freemarker.core.Configurable.setSetting (String, String)

Configuration de la couche de configuration

freemarker.template.Configuration.setSetting(String,String)


Charger le modèle

Chargeur de modèles

Le chargeur de modèles est l'objet qui charge les données d'origine en fonction du chemin abstrait ("index.ftl" ou "products/catalog.ftl") et du type de ressources chargées ( données du fichier dans le répertoire ou données dans la base de données) dépend de l'implémentation spécifique du chargeur. Lorsque vous appelez cfg.getTemplate, FreeMarker vous demandera le chargeur de modèles que vous avez précédemment configuré pour l'objet Configuration. Le chargeur de modèles est responsable du chargement du fichier.

Chargeur de modèles intégré
Vous pouvez utiliser les trois méthodes suivantes pour définir les trois méthodes de chargement des modèles

void setDirectoryForTemplateLoading(File dir);

ou

void setClassForTemplateLoading(Class cl, String prefix);

ou

void setServletContextForTemplateLoading(Object servletContext, String path);

La première méthode ci-dessus Display spécifie un répertoire dans le système de fichiers. FreeMarker enregistrera le modèle dans ce répertoire. Inutile de dire que ce répertoire doit exister, sinon une exception sera levée.

La deuxième méthode utilise une classe comme paramètre d'entrée. Lorsque vous souhaitez utiliser ClassLoader pour charger le modèle, vous pouvez utiliser cette méthode pour rechercher le fichier modèle en même temps. cette méthode de chargement de modèles est plus stable que la précédente, notamment dans les systèmes de production. Vous pouvez facilement regrouper des fichiers de ressources, des icônes, etc. dans des fichiers .jar.

La troisième méthode prend le contexte de l'application web et le chemin de base (par rapport au chemin parent de WEN-INF) comme paramètres. Ce style de chargeur de modèles chargera les modèles à partir du contexte de l'application Web.

Chargement de modèles à partir de plusieurs emplacements

Si vous souhaitez charger des modèles à partir de plusieurs emplacements, vous pouvez créer un seul chargeur de modèles correspondant aux différents emplacements, puis les envelopper dans un nom Appelez le MultiTemplateLoader chargeur de modèles, et enfin définissez-le sur l'objet Configuration via la méthode setTemplateLoader(TemplateLoader loader). Voici un exemple de chargement de modèles à partir de deux emplacements différents :

import freemarker.cache.*; dans ce paquet... FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates")); FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates")); getClass(), ""); TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl }; MultiTemplateLoader mtl = new MultiTemplateLoader(loaders); cfg.setTemplateLoader(mtl); recherchez le fichier modèle dans le chemin /tmp/templates. S'il n'est pas trouvé, il reviendra au chemin /usr/data/templates pour rechercher. S'il n'est pas trouvé, il essaiera de le charger à l'aide du chargeur de classe. .

Obtenez des fichiers de modèles à partir d'autres ressources

Si aucun de ces chargeurs de modèles intégrés ne répond à vos besoins, vous pouvez personnaliser un chargeur de modèles par vous-même, implémentez simplement freemarker. Utilisez simplement le .cache. Interface TemplateLoader, puis transmettez-le à l'objet Configuration via la méthode setTemplateLoader (chargeur TemplateLoader).

Modèles de mise en cache

Les modèles de mise en cache FreeMarker signifient que lorsque vous obtenez un modèle via la méthode getTemplate, FreeMarker renverra non seulement un objet Template, mais mettra également l'objet en cache la prochaine fois qu'un modèle est demandé avec le même chemin, il renverra l'objet modèle dans le cache. Si vous modifiez le fichier modèle, FreeMarker rechargera et réanalysera automatiquement le modèle la prochaine fois que vous obtiendrez le modèle. Même ainsi, si déterminer directement si un fichier a été modifié est une opération fastidieuse, FreeMarker fournit un paramètre de configuration « délai de mise à jour » au niveau de l'objet de configuration. Ce paramètre indique le temps nécessaire à FreeMarker pour déterminer la version du modèle. Le paramètre par défaut est de 5 secondes, ce qui signifie qu'il déterminera si le modèle a été modifié toutes les 5 secondes. Si vous souhaitez déterminer en temps réel, définissez. ce paramètre à 0 . Un autre point à noter est que tous les chargeurs ne prennent pas en charge cette méthode de jugement. Par exemple, un chargeur de modèle basé sur un chargeur de classe ne constatera pas que vous avez modifié le fichier modèle.

Voici comment FreeMarker supprime les modèles dans le cache. Vous pouvez utiliser la méthode de l'objet de configuration clearTemplateCache pour effacer manuellement les objets modèles dans le cache. En fait, la partie cache peut être ajoutée à FreeMarker en tant que composant (c'est-à-dire qu'elle peut utiliser des solutions de mise en cache tierces). Vous pouvez le faire en définissant le paramètre cache_storage. Pour la plupart des développeurs, l’implémentation freemarker.cache.MruCacheStorage fournie avec FreeMarker est suffisante. Ce cache utilise une stratégie à 2 niveaux la plus récemment utilisée. Au premier niveau, toutes les entrées du cache sont fortement référencées (les entrées ne sont pas connues de la JVM, contrairement à celles légèrement référencées) jusqu'à ce que la durée maximale soit atteinte, et les entrées les moins récemment utilisées sont migrées vers le cache de deuxième niveau. Les entrées à ce niveau utilisent des références faibles jusqu'à leur expiration. Si la taille des zones de référence et de référence forte peut être définie dans le constructeur, par exemple, si vous souhaitez définir la zone de référence forte à 20 et la zone de référence faible à 250, alors vous pouvez utiliser le code suivant :

cfg .setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))

Étant donné que MruCacheStorage est l'implémentation du cache par défaut, vous pouvez également la définir comme ceci :

cfg.setSetting (Configuration.CACHE_STORAGE_KEY, "strong:20, soft:250");

Lorsque vous créez une nouvelle configuration, elle utilise l'implémentation du cache MruCacheStorage par défaut et la valeur par défaut maxStrongSize est égale à 0, maxSoftSize est égale à Integer.MAX_VALUE (c'est-à-dire la valeur maximale théorique). Mais pour les systèmes à forte charge, nous vous recommandons de définir maxStrongSize sur une valeur autre que 0, sinon cela entraînera un rechargement et une nouvelle analyse fréquents des modèles.

Gestion des exceptions

Exceptions possibles

Les exceptions générées par FreeMarker entrent généralement dans les catégories suivantes :

Exceptions générées lors de la phase d'initialisation de FreeMarker : généralement pendant Votre application n'a besoin d'initialiser FreeMarker qu'une seule fois, et l'exception générée par la classe pendant cette période est appelée exception d'initialisation.

Exceptions lors du chargement et de l'analyse du modèle : lorsque vous obtenez le modèle via la méthode Configuration.getTemplate() (si le modèle n'a pas été mis en cache auparavant), deux types d'exceptions se produiront :

IOException : parce que le modèle n'est pas trouvé ou que d'autres exceptions IO se produisent lors de la lecture du modèle, par exemple si vous n'êtes pas autorisé à lire le fichier, etc. freemarker.core.ParseException en raison d'une syntaxe incorrecte du fichier modèle ; ;

Exceptions lors de l'exécution : lorsque vous appelez la méthode Template.process(...), deux types d'exceptions seront levées :

IOException Erreurs qui se produisent lors de l'écriture de données dans la sortie ; freemarker.templatException Autres exceptions générées lors de l'exécution. Par exemple, l'une des erreurs les plus courantes est que le modèle fait référence à une variable qui n'existe pas.

Pour plus d'articles sur la configuration de FreeMarker, veuillez payer ; attention au site PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn