IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Velocity String à la place de fichier .vm


Sujet :

API standards et tierces Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Par défaut Velocity String à la place de fichier .vm
    Bonjour,

    j'utilise velocity pour générer le corps d'un mail que l'application se chargera d'envoyer, en utilisant la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, path_du_fichier_vm, parametres)
    le texte de l'email est bien généré, ma question est : est-ce qu'il y a une méthode qui permet de générer du texte à l'aide de velocity mais cette fois ci pas à partir d'un fichier .vm mais directement à partir d'un String?

    Merci d'avance

  2. #2
    Membre chevronné Avatar de Mandraxx
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2011
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 182
    Par défaut
    Bonjour,

    Oui, c'est possible en encapsulant un peu le moteur .

    J'ai fait ça dans une appli de gestion comptable pour disposer d'un puissant langage de formatage au runtime (actuellement je tourne sur velocity 1.6.4).

    En gros, le principe est le suivant :

    • Tu crée une classe implantant le contrat org.apache.velocity.runtime.resource.loader.ResourceLoader qui va stocker le code VTL dans une Map
    • Dans ton constructeur, tu référence ton objet au sein d'un attribut statique (afin que ton loader soit accessible par le code externe à Velocity via une méthode du style MonLoader.getInstance()...)
    • Tu rajoute à ton loader des méthodes pour ajouter / supprimer des bouts de code VTL dans la Map

    Il faut ensuite déclarer le loader dans la configuration (velocity.properties) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    resource.loader = MonLoaderID
    MonLoaderID.resource.loader.description = Internal script provider 
    MonLoaderID.resource.loader.class = MonLoader
    MonLoaderID.resource.loader.cache = false
    MonLoaderID.resource.loader.modificationCheckInterval = 2
    Surtout bien penser à désactiver le cache ! (notamment si tu génère des ID de ressources aléatoire comme je le fais c'est du vécu ... )

    Bon, voilà : après ça, tu es intégré dans le cœur du produit. Le fait d'initialiser Velocity crée ton instance de MonLoader qui est alors accessible via MonLoader.getInstance().

    Reste plus qu'à créer un petit wrapper auquel tu passe la string contenant le code + un contexte :

    • Tu dépose alors le code dans ton loader personnalisé avec une clé aléatoire (UUID par exemple)
    • Tu charge la template et tu merge de manière classique comme si ton UUID était un fichier
    • Tu supprime le code de ton loader personnalisé pour libérer la mémoire (c'est là que le cache joue des tours et provoque des OutOfMemory puisque l'UUID change à chaque appel )

    Pour moi, çà marche depuis 2007.

    @+

  3. #3
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Par défaut
    Bonjour Mandraxx,

    Merci beaucoup pour ta réponse
    Au fait, après avoir fais des recherches (avant de lire ta réponse), j'ai trouvé une méthode simple qui permet de réaliser ce que je cherchais, c'est la méthode "evaluate" :

    velocityEngine.evaluate(context, writer, logTag, reader)

    il suffit d'initialiser le contexte et le remplir avec les paramètres souhaités pour le passer à la méthode. writer est le StringWriter où le résultat (texte généré) va être stocké, reader est le template (String), et logTag et un String pour stocker les "log messages" en cas d'erreurs (je lui donne "" car j'en n'ai pas besoin pour le moment).

    Merci encore pour ta réponse, j'espère que d'autres personnes bénéficieront de cette discussion

    @+

  4. #4
    Membre chevronné Avatar de Mandraxx
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2011
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 182
    Par défaut
    Salut,

    Je ne connaissais pas cette méthode mais c'est effectivement bien plus simple d'utilisation.

    Merci pour cette info .

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liste répertoire à la place du fichier index.jsp
    Par quilo dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 18/09/2007, 15h26
  2. Réponses: 13
    Dernier message: 09/11/2006, 23h37
  3. Nettoyer String □ (recup d'1 fichier binaire)
    Par gabule dans le forum Langage
    Réponses: 4
    Dernier message: 31/05/2006, 15h09
  4. [DOM] Parser un String et non un fichier
    Par Zenol dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/04/2006, 12h20
  5. [JSP][Tomcat] COmment choisir la place des fichiers .class?
    Par mathieu dans le forum Tomcat et TomEE
    Réponses: 16
    Dernier message: 03/03/2004, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo