listar jtls formulario curso biblioteca agregar java jsp el text-formatting

formulario - jtls java



JSTL/JSP EL(lenguaje de expresión) en un contexto no JSP(independiente) (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 (Expression Language)?

Esperaría poder 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}

proporcionarle un contexto que incluiría un diccionario de valores de 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 veo esto como un gran framework de plantillas de peso pesado. Solo una mejor versión de la funcionalidad básica de formato de mensaje que Java ya proporciona

Por ejemplo, puedo lograr lo anterior con java.text.MessageFormat usando 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 puedo pasarlo a una matriz de Objetos, en mi programa Java llamante

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

Sin embargo, en este uso, el código y el patrón están íntimamente vinculados. 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.


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


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

http://freemarker.org/


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

Esta publicación de blog describe cómo hacerlo: Java: usando EL fuera de J2EE .


Yo recomendaría investigar Apache Velocity . Es bastante simple y ligero.

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


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


AAh. Mientras que con MessageFormat, 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 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.



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



Me decantaría por el lenguaje de Spring Expression:

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

Algunos 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 usar propiedades de 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 ?"