Comment # inclure un fichier d'un modèle Velocity en utilisant ClasspathResourceLoader
Je suis à traiter avec un code Java où la Vitesse de 1,7 est définie de façon à extraire des modèles par le biais de la ClasspathResourceLoader. Ci-dessous est une dépouillé exemple de code. C'est à partir d'une Tapisserie de l'application web s'exécutant sur un serveur Jetty.
La classe Java, les modèles et les fichiers à inclure sont tous dans le même dossier "testpackage", donc dans le POT ils sont tous dans le même paquet "testpackage".
Le problème est que si le modèle contient un
#include("MyInclude.vm")
directive, la Vitesse ne peut pas trouver "MyInclude.vm", et il jette un ResourceNotFoundException.
Depuis dans l'argument de getTemplate je doit ajouter le nom du paquet pour le nom de modèle, j'ai aussi essayé de faire la même chose dans le #inclure à l'intérieur du modèle:
#include("testpackage/MyInclude.vm")
mais la seule différence est que ce dernier fonctionne, si je lance l'application web à partir d'Eclipse, alors que l'ancien ne fonctionne pas, même à partir d'Eclipse.
Si j'construire, déployer les Pots et exécuter l'application web du déploiement, les deux syntaxes échouer avec le même ResourceNotFoundException.
La Vitesse de doc à http://velocity.apache.org/engine/releases/velocity-1.7/user-guide.html#Include dit:
"Pour des raisons de sécurité, le fichier ne peut être sous
TEMPLATE_ROOT"
Absolument, cela pourrait être la cause de mon problème, mais je n'ai pas été en mesure de trouver plus d'informations sur ce TEMPLATE_ROOT est réellement.
Il ressemble beaucoup à une variable d'environnement, mais je ne sais pas ce que je devrait mettre à, depuis que je suis à l'aide d'un ClasspathResourceLoader, et le fichier à inclure est pas un fichier situé dans un dossier, il est à l'intérieur de la JARRE contenant les modèles et la classe Java (et tous dans le même paquet).
J'ai trouvé TEMPLATE_ROOT mentionné dans une autre question, Où dois-je mettre de la Vitesse les fichiers de modèle pour un utilitaire de ligne de commande intégré avec Maven? , mais c'est lié à l'utilisation d'un FileResourceLoader. J'ai besoin de garder à l'aide de la ClasspathResourceLoader et j'ai besoin de tous les fichiers dans le POT, pas à l'extérieur de la normale de fichiers dans un dossier.
TestVelocity.java
package testpackage;
import java.io.StringWriter;
import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
public class TestVelocity
{
public static String getText()
{
String text = "";
Properties properties = new Properties();
properties.setProperty("resource.loader", "class");
properties.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
VelocityEngine engine = new VelocityEngine();
VelocityContext context = new VelocityContext();
StringWriter writer = new StringWriter();
try
{
engine.init(properties);
//This works because the template doesn't contain any #include
Template template = engine.getTemplate("testpackage/TemplateWithoutInclude.vm");
//This causes ResourceNotFoundException: Unable to find resource 'TemplateWithInclude.vm'
//Template template = engine.getTemplate("testpackage/TemplateWithInclude.vm");
template.merge(context, writer);
text = writer.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return text;
}
}
TemplateWithoutInclude.vm
<!DOCTYPE html>
<html>
<head></head>
<body>
<p>Hello</p>
</body>
</html>
TemplateWithInclude.vm
<!DOCTYPE html>
<html>
<head></head>
<body>
#include("MyInclude.vm")
</body>
</html>
MyInclude.vm
<p>
Hello
</p>
source d'informationauteur SantiBailors
Vous devez vous connecter pour publier un commentaire.
Re l'exemple de code, le problème est résolu par l'ajout d'un propriété de la
Properties
instance utilisée pour initialiser le moteur:Cela permet de référencer le chemin d'accès du fichier comme un chemin relatif au dossier où le dont le modèle est. Donc, si les deux fichiers sont dans le même dossier puis pas de chemin d'accès doit être spécifié dans le
#include
directive: il suffit de#include("MyInclude.vm")
.J'ai aussi été en espérant apprendre quelque chose au sujet de l'obscur (pour moi)
TEMPLATE_ROOT
comme pour les anciens. ce qu'il est, car il est étonnamment difficile pour moi de trouver cette info documenté n'importe où. Mais quel qu'il soit, au moins dans mon cas, il correspond à la racine du package de projet Java (le package "default"). Cela signifie que si je n'utilise pas la propriété supplémentaire mentionné ci-dessus, puis en plaçant le fichierMyInclude.vm
dans le package racine œuvres.