JSTL/JSP EL (Lenguaje de Expresión) en un no JSP (independiente) contexto
-
01-07-2019 - |
Pregunta
¿Alguien puede recomendar un marco para la creación de plantillas/formato de mensajes en una aplicación independiente a lo largo de las líneas de la JSP de EL (Lenguaje de Expresión)?
Yo esperaría a ser capaz de crear una instancia de 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 un contexto que incluyen un valor diccionario de objetos de parámetro (en este caso un objeto de tipo Cliente con un nombre de "el cliente", dicen, y un objeto de tipo Orden con el nombre de 'orden').
Sé que hay muchos de la plantilla de marcos hay - muchos de los cuales trabajan fuera del contexto de aplicación web, pero no veo esto como un gran peso pesado de las plantillas de marco.Solo una mejor versión de los básicos de Formato de Mensaje de la funcionalidad de Java, ya ofrece
Por ejemplo, yo puedo lograr lo anterior con java.texto.MessageFormat mediante el uso de una plantilla (o un 'patrón' como ellos lo llaman), tales 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 llamado programa de Java
new Object[] { customer.getFirstName(), order.getEstimatedDispatchDate() };
Sin embargo, en este uso, el código y el diseño están íntimamente ligados.Mientras me podría poner el patrón de un recurso de propiedades del archivo, el código y el patrón necesita saber los detalles íntimos acerca de cada uno de los otros.Con EL sistema, el contrato entre el código y el patrón sería en un nivel mucho más alto (por ejemplo,el cliente y el orden, sino el cliente.el nombre y el orden.estimatedDispatchDate), lo que es más fácil cambiar la estructura, el orden y el contenido del mensaje sin cambiar ningún código.
Solución
Puedes usar el Universal Lenguaje de Expresión de sí mismo.Usted necesita una aplicación (aunque hay varios para elegir).Después de eso, usted necesita para implementar tres clases:ELResolver, FunctionMapper y VariableMapper.
Este blog describe cómo hacerlo: Java:utilizando EL exterior J2EE.
Otros consejos
StringTemplate es una más ligera alternativa a la Velocidad y Freemarker.
Yo recomendaría buscar en Apache Velocity.Es muy sencillo y ligero.
Actualmente estamos utilizando nuestras plantillas de correo electrónico, y funciona muy bien.
Usted puede utilizar Casper muy similar a jsp y fácil de usar : Casper
Yo iría por la Primavera del lenguaje de la Expresión:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html
Un par de ejemplos que demuestran el poder (los dos primeros 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 utilizar las propiedades de los objetos:
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 ?"
Re:Jasper y Juel siendo construido por 1.5:Y entonces descubrí RetroTranslator (http://retrotranslator.sourceforge.net/).Una vez retrotranslated, EL y Jasper funciona como un encanto
La idea de usar EL mismo fuera de Java EE se abogó por Ed Burns y discutido en El Lado del Servidor.Juerga de solteros aplicación naves en un FRASCO separado pero no sé si puede ser utilizado fuera del servidor.
Freemarker haría exactamente lo que usted necesita.Este es un motor de plantillas con una sintaxis muy similar a JSP :
AAh.Mientras que con MessageFormat, que 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 formatea de acuerdo con el patrón, no hay ningún equivalente en EL.
En JSP, yo habría usado, tal vez, un formato de etiqueta.En este autónomo ejemplo, voy a tener que formatear la Fecha como una Cadena en mi código antes de evaluar la expresión.