JSTL / JSP EL (язык выражений) в контексте, отличном от JSP (автономный)
может ли кто-нибудь рекомендовать структуру для шаблонов/форматирования сообщений в автономном приложении по аналогии с JSP EL (язык выражений)?
Я ожидал бы, что смогу создать экземпляр какого-либо объекта, дать ему шаблон по строкам
Dear ${customer.firstName}. You order will be dispatched on ${order.estimatedDispatchDate}
предоставьте ему контекст, который будет включать словарь значений объектов параметров (в этом случае объект типа Customer с именем "customer", скажем, и объект типа Order с название "заказ").
Я знаю, что есть много шаблонов фреймворков - многие из которых работают вне контекста веб-приложения, но я не рассматриваю это как большую тяжелую структуру шаблонов. Просто лучшая версия основной функциональности формата сообщений Java уже предоставляет
например, я могу выполнить вышеуказанное с java.текст.MessageFormat, используя шаблон (или "шаблон", как они его называют), такой как
Dear {0}. You order will be dispatched on {1,date,EEE dd MMM yyyy}
и я могу передать ему объект массив, в моей вызывающей Java-программе
new Object[] { customer.getFirstName(), order.getEstimatedDispatchDate() };
однако в этом использовании код и шаблон тесно связаны. Хотя я мог бы поместить шаблон в файл свойств ресурса, код и шаблон должны знать интимные детали друг о друге. С EL-подобной системой контракт между кодом и шаблоном будет на гораздо более высоком уровне (например, клиент и заказ, а не клиент.firstName и порядок.estimatedDispatchDate), что облегчает изменение структура, порядок и содержание сообщения без изменения какого-либо кода.
10 ответов
вы можете просто использовать сам универсальный язык выражений. Вам нужна реализация (но есть несколько вариантов на выбор). После этого необходимо реализовать три класса: ELResolver, FunctionMapper и VariableMapper.
это сообщение в блоге описывает, как это сделать:Java: использование EL вне J2EE.
Я бы рекомендовал посмотреть в Скорость Apache. Это довольно простой и легкий.
в настоящее время мы используем его для наших шаблонов электронной почты, и она работает очень хорошо.
вы можете использовать Каспер очень похож на jsp и прост в использовании:Каспер
Я бы пошел на язык весеннего выражения:
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html
несколько примеров, демонстрирующих мощность (первые два из документации):
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}'
выражения также могут использовать свойства объекта:
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 и Juel строятся для 1.5: а затем я обнаружил ретранслятор (http://retrotranslator.sourceforge.net/). После ретротранслирования EL и Jasper работают как шарм
идея использования самого EL вне Java EE была выступает Эд Бернс и обсуждается на стороне сервера. Реализация коты корабли в отдельной банке но я не знаю, можно ли его использовать вне сервера.
Freemarker сделает именно то, что вам нужно. Это механизм шаблонов с синтаксисом, очень похожим на JSP:
аах. В то время как с MessageFormat я могу сделать
Dear {0}. Your order will be dispatched on {1,date,EEE dd MMM yyyy}
где параметр #1 является объектом Date и форматируется в соответствии с шаблоном, эквивалента в EL нет.
в JSP я бы использовал, возможно, тег формата. В этом отдельном примере мне придется отформатировать дату как строку в моем коде до оценки выражения.