Question

Quelqu'un peut-il recommander un cadre pour la modélisation / mise en forme des messages dans une application autonome, à l'instar du JSP EL (Expression Language)?

Je m'attendrais à pouvoir instancier un objet, lui donner un modèle dans le sens de

Dear ${customer.firstName}. You order will be dispatched on ${order.estimatedDispatchDate}

fournissez-lui un contexte qui inclurait un dictionnaire de valeurs d'objets paramètres (dans ce cas, un objet de type Client avec un nom "client", disons, et un objet de type Commande avec un nom "ordre").

Je sais qu'il existe de nombreux frameworks de modèles, dont beaucoup fonctionnent en dehors du contexte de l'application Web, mais je ne vois pas cela comme un framework de template très lourd. Juste une meilleure version de la fonctionnalité de base du format de message fournie par Java

Par exemple, je peux accomplir ce qui précède avec java.text.MessageFormat en utilisant un modèle (ou un "motif" comme ils l'appellent), tel que

.
Dear {0}. You order will be dispatched on {1,date,EEE dd MMM yyyy}

et je peux lui passer un tableau d'objets, dans mon programme Java appelant

new Object[] { customer.getFirstName(), order.getEstimatedDispatchDate() };

Cependant, dans cet usage, le code et le motif sont intimement liés. Bien que je puisse mettre le modèle dans un fichier de propriétés de ressources, le code et le modèle doivent connaître des détails intimes les uns sur les autres. Avec un système de type EL, le contrat entre le code et le modèle se situerait à un niveau beaucoup plus élevé (par exemple, client et commande, plutôt que client.firstName et order.estimatedDispatchDate), ce qui faciliterait la modification de la structure, de la commande et du contenu. du message sans changer de code.

Était-ce utile?

La solution

Vous pouvez simplement utiliser le langage d’expression universel lui-même. Vous avez besoin d'une implémentation (mais vous pouvez en choisir quelques-uns). Ensuite, vous devez implémenter trois classes: ELResolver, FunctionMapper et VariableMapper.

Ce billet de blog explique comment procéder: Java : utiliser EL en dehors de J2EE .

Autres conseils

StringTemplate est une alternative plus légère à Velocity et Freemarker.

Je recommanderais de rechercher Apache Velocity . C'est assez simple et léger.

Nous l'utilisons actuellement pour nos modèles de courrier électronique, et cela fonctionne très bien.

Vous pouvez utiliser Casper de manière très similaire à jsp et facile à utiliser: Casper

Je choisirais le langage Spring Expression:

http: //docs.spring. io / spring / docs / current / spring-framework-reference / html / expressions.html

Quelques exemples illustrant le pouvoir (les deux premiers sont tirés de la documentation):

int year = (Integer) parser.parseExpression("Birthdate.Year + 1900").getValue(context);

String city = (String) parser.parseExpression("placeOfBirth.City").getValue(context);

// weekday is a String, e.g. "Mon", time is an int, e.g. 1400 or 900
{"Thu", "Fri"}.contains(weekday) and time matches '\d{4}'

Les expressions peuvent également utiliser les propriétés de l'objet:

public class Data {
    private String name; // getter and setter omitted
}

Data data = new Data();
data.setName("John Doe");

ExpressionParser p = new SpelExpressionParser();
Expression e = p.parseExpression("name == 'John Doe'");
Boolean r = (Boolean) e.getValue(data); // will return true

e = p.parseExpression("Hello " + name + ", how are you ?");
String text = e.getValue(data, String.class); // text will be "Hello John Doe, how are you ?"

Vous voudrez peut-être consulter OGNL , qui est le type de bibliothèque que vous recherchez. OGNL peut être assez puissant et constitue le langage d’expression utilisé dans le cadre Web WebWork .

Objet: Jasper et Juel en cours de construction pour la version 1.5: Et ensuite, j'ai découvert RetroTranslator ( http: //retrotranslator.sourceforge. net / ). Une fois rétrotraduit, EL et Jasper fonctionnent à merveille

L'idée d'utiliser EL lui-même en dehors de Java EE était défendu par Ed Burns et discuté du côté du serveur . L'implémentation de Tomcats est expédiée dans un fichier JAR séparé , mais je ne sais pas s'il peut être utilisé. en dehors du serveur.

Freemarker ferait exactement ce dont vous avez besoin. Ceci est un moteur de template avec une syntaxe très similaire à JSP:

http://freemarker.org/

AAh. Considérant qu'avec MessageFormat, je peux faire

Dear {0}. Your order will be dispatched on {1,date,EEE dd MMM yyyy}

où le paramètre n ° 1 est un objet Date et qu'il est formaté conformément au modèle, il n'y a pas d'équivalent dans EL.

Dans JSP, j'aurais peut-être utilisé une balise de format. Dans cet exemple autonome, je vais devoir formater la date en tant que chaîne dans mon code avant d'évaluer l'expression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top