2008-09-18 9 views
10

¿Alguien puede recomendar un marco para plantillas/formatear mensajes en una aplicación independiente a lo largo de las líneas de JSP EL (Lenguaje de Expresión)?JSTL/JSP EL (Lenguaje de Expresión) en un contexto no JSP (independiente)

que sería de esperar para poder instanciar un objeto de algún tipo, darle una plantilla a lo largo de las líneas de

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

proporcionar con un contexto que incluiría un diccionario valor de los objetos de parámetros (en este caso un objeto de tipo Cliente con un nombre 'cliente', por ejemplo, y un objeto de tipo Ordenar con un nombre 'orden').

Sé que hay muchos frameworks de plantillas, muchos de los cuales funcionan fuera del contexto de la aplicación web, pero no lo veo como un framework de plantillas grandes y pesadas. Sólo una mejor versión de la funcionalidad básica Formato de mensajes de Java ya ofrece

Por ejemplo, puedo lograr lo anterior con java.text.MessageFormat mediante el uso de una plantilla (o un 'patrón', como lo llaman) como

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

y me puede pasar un array de objetos, en mi programa Java llamando

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

Sin embargo, en este uso, el código y el patrón están íntimamente ligados. Si bien pude poner el patrón en un archivo de propiedades de recursos, el código y el patrón necesitan conocer detalles íntimos sobre el otro. Con un sistema tipo EL, el contrato entre el código y el patrón sería a un nivel mucho más alto (por ejemplo, cliente y orden, en lugar de customer.firstName y order.estimatedDispatchDate), lo que facilita cambiar la estructura, el orden y los contenidos. del mensaje sin cambiar ningún código.

Respuesta

10

Puede utilizar el Lenguaje de Expresión Universal. Necesita una implementación (pero hay algunas para elegir). Después de eso, debe implementar tres clases: ELResolver, FunctionMapper y VariableMapper.

Esta publicación del blog describe cómo hacerlo: Java: using EL outside J2EE.

+0

Gracias. Eso se ve realmente útil. Desafortunadamente, un intento rápido de reemplazar mi código basado en MessageFormat falló porque estoy usando Java 1.4 (tanto Jasper como Juel están compilados para 1.5). Podría tratar de encontrar una versión anterior o crear mi propio JAR a partir de la fuente – Vihung

2

Recomendaría mirar en Apache Velocity. Es bastante simple y ligero.

Actualmente lo estamos utilizando para nuestras plantillas de correo electrónico, y funciona muy bien.

+1

Me parece que la velocidad es demasiado pesada para esta tarea, recuerde que estoy comparando con el Java MessageFormat – Vihung

1

Es posible que desee mirar OGNL que es el tipo de biblioteca que está buscando. OGNL puede ser razonablemente potente y es el lenguaje de expresión utilizado en el marco web WebWork.

0

Freemarker haría exactamente lo que necesita. Se trata de un motor de plantillas con una sintaxis muy similar a JSP:

http://freemarker.org/

+0

. Creo que Freemarker es demasiado pesado para esta tarea también (ver el comentario anterior sobre Velocity). Recuerda que estoy comparando con el Java MessageFormat. – Vihung

4

StringTemplate es una alternativa más ligera a velocidad y Freemarker.

0

AAh. Mientras que con MessageFormat, no puedo hacer

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

donde el parámetro # 1 es un objeto Date y se hace con formato de acuerdo con el patrón, no hay equivalente en EL.

En JSP, hubiera usado, tal vez, una etiqueta de formato. En este ejemplo independiente, voy a tener que formatear la fecha como una cadena en mi código antes de evaluar la expresión.

2

Puede utilizar Casper muy similar a JSP y fácil de usar: Casper

2

Yo iría por el lenguaje de expresión de primavera:

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

Unos pocos ejemplos que demuestran el poder (la primera dos son de la documentación):

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}' 

Las expresiones también pueden usar las propiedades del objeto:

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