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.


StringTemplate более облегченная алтернатива к скорости и Freemarker.


Я бы рекомендовал посмотреть в Скорость 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 ?"

вы можете посмотреть на OGNL какая библиотека вам нужна. OGNL может быть достаточно мощным и является языком выражения, используемым в WebWork веб-фреймворк.


Re: Jasper и Juel строятся для 1.5: а затем я обнаружил ретранслятор (http://retrotranslator.sourceforge.net/). После ретротранслирования EL и Jasper работают как шарм


идея использования самого EL вне Java EE была выступает Эд Бернс и обсуждается на стороне сервера. Реализация коты корабли в отдельной банке но я не знаю, можно ли его использовать вне сервера.


Freemarker сделает именно то, что вам нужно. Это механизм шаблонов с синтаксисом, очень похожим на JSP:

http://freemarker.org/


аах. В то время как с MessageFormat я могу сделать

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

где параметр #1 является объектом Date и форматируется в соответствии с шаблоном, эквивалента в EL нет.

в JSP я бы использовал, возможно, тег формата. В этом отдельном примере мне придется отформатировать дату как строку в моем коде до оценки выражения.