JSTL / JSP EL (Expression Language) in un contesto non JSP (standalone)

Qualcuno può raccomandare un framework per la templatura / formattazione dei messaggi in un’applicazione standalone lungo le linee di JSP EL (Expression Language)?

Mi aspetterei di poter istanziare un object di qualche tipo, dargli un modello lungo le linee di

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

forniscigli un contesto che includa un dizionario di valori di oggetti parametro (in questo caso un object di tipo Cliente con un nome ‘cliente’, per esempio, e un object di tipo Ordine con un nome ‘ordine’).

So che ci sono molti framework di template là fuori – molti dei quali funzionano al di fuori del contesto delle applicazioni web, ma non lo vedo come un grande schema di template dei pesi massimi. Solo una versione migliore della funzionalità di base del formato del messaggio che Java fornisce già

Ad esempio, posso eseguire quanto sopra con java.text.MessageFormat usando un modello (o un “pattern” come lo chiamano) come

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

e posso passargli una matrice Object, nel mio programma Java chiamante

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

Tuttavia, in questo utilizzo, il codice e il pattern sono intimamente collegati. Mentre potrei inserire il modello in un file delle proprietà della risorsa, il codice e il pattern devono conoscere i dettagli intimi l’uno dell’altro. Con un sistema simile a EL, il contratto tra il codice e il modello sarebbe a un livello molto più elevato (ad esempio, cliente e ordine, piuttosto che customer.firstName e order.estimatedDispatchDate), rendendo più semplice cambiare struttura, ordine e contenuto del messaggio senza modificare alcun codice.

Puoi semplicemente usare l’Universal Expression Language stesso. Hai bisogno di un’implementazione (ma ce ne sono alcuni tra cui scegliere). Successivamente, è necessario implementare tre classi: ELResolver, FunctionMapper e VariableMapper.

Questo post del blog descrive come farlo: Java: usare EL all’esterno di J2EE .

StringTemplate è un’alternativa più leggera a Velocity e Freemarker.

Consiglierei di guardare in Apache Velocity . È abbastanza semplice e leggero.

Lo stiamo attualmente utilizzando per i nostri modelli di posta elettronica e funziona molto bene.

Puoi usare Casper molto simile a jsp e facile da usare: Casper

Vorrei andare per il linguaggio delle espressioni di spring:

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

Alcuni esempi che dimostrano la potenza (i primi due provengono dalla documentazione):

 int year = (Integer) parser.parseExpression("Birthdate.Year + 1900").getValue(context); String city = (String) parser.parseExpression("placeOfBirth.City").getValue(context); // weekday is a String, eg "Mon", time is an int, eg 1400 or 900 {"Thu", "Fri"}.contains(weekday) and time matches '\d{4}' 

Le espressioni possono anche utilizzare le proprietà dell’object:

 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 ?" 

Potresti voler guardare OGNL che è il tipo di libreria che stai cercando . L’OGNL può essere ragionevolmente potente ed è il linguaggio di espressione utilizzato nel framework Web di WebWork .

Ri: Jasper e Juel in costruzione per 1.5: E poi ho scoperto RetroTranslator ( http://retrotranslator.sourceforge.net/ ). Una volta retrotraslati, EL e Jasper funzionano come un incantesimo

L’idea di usare la stessa EL al di fuori di Java EE è stata sostenuta da Ed Burns e discussa su The Server Side . L’implementazione di Tomcats viene fornita in un JAR separato ma non so se può essere utilizzata al di fuori del server.

Freemarker farebbe esattamente ciò di cui hai bisogno. Questo è un motore di template con una syntax molto simile a JSP:

http://freemarker.org/

AAh. Mentre con MessageFormat, posso farlo

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

dove il parametro # 1 è un object Date e viene formattato in base al pattern, non esiste un equivalente in EL.

In JSP, avrei usato, forse, un tag di formato. In questo esempio indipendente, dovrò formattare la data come stringa nel mio codice prima di valutare l’espressione.