JSTL / JSP EL (язык выражений) в не JSP (автономном) контексте - PullRequest
10 голосов
/ 18 сентября 2008

Кто-нибудь может порекомендовать каркас для шаблонирования / форматирования сообщений в автономном приложении по аналогии с JSP EL (Expression Language)?

Я ожидаю, что смогу создать экземпляр какого-либо объекта, дать ему шаблон в соответствии с

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

предоставляет ему контекст, который будет включать в себя словарь значений объектов параметров (в данном случае, например, объект типа Customer с именем 'customer' и объект типа Order с именем 'order').

Я знаю, что существует множество шаблонных фреймворков, многие из которых работают вне контекста веб-приложения, но я не рассматриваю это как большую тяжеловесную шаблонную фреймворк. Просто лучшая версия базовой функциональности формата сообщений, которую Java уже предоставляет

Например, я могу выполнить вышеизложенное с помощью java.text.MessageFormat, используя шаблон (или «шаблон», как они его называют), например

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

и я могу передать ему массив объектов в моей вызывающей Java-программе

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

Однако при этом использовании код и шаблон тесно связаны между собой. Хотя я мог бы поместить шаблон в файл свойств ресурса, код и шаблон должны знать интимные подробности друг о друге. В EL-подобной системе контракт между кодом и шаблоном будет на гораздо более высоком уровне (например, customer и order, а не customer.firstName и order.estimatedDispatchDate), что облегчит изменение структуры, порядка и содержимого. сообщения без изменения кода.

Ответы [ 10 ]

10 голосов
/ 18 сентября 2008

Вы можете просто использовать сам язык универсальных выражений. Вам нужна реализация (но есть из чего выбирать). После этого вам нужно реализовать три класса: ELResolver, FunctionMapper и VariableMapper.

В этом блоге описывается, как это сделать: Java: использование EL вне J2EE .

4 голосов
/ 23 сентября 2008

StringTemplate - более легкая альтернатива Velocity и Freemarker.

2 голосов
/ 22 февраля 2015

Я бы выбрал язык Spring Expression:

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 ?"
2 голосов
/ 12 декабря 2010

Вы можете использовать Casper, очень похожий на jsp и простой в использовании: Casper

2 голосов
/ 18 сентября 2008

Я бы порекомендовал посмотреть Apache Velocity . Это довольно просто и легко.

В настоящее время мы используем его для наших шаблонов электронной почты, и он работает очень хорошо.

1 голос
/ 25 сентября 2008

Re: Джаспер и Джуэль строятся за 1,5 года. А потом я обнаружил RetroTranslator (http://retrotranslator.sourceforge.net/). После ретрансляции, EL и Jasper работают как шарм

1 голос
/ 18 сентября 2008

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

1 голос
/ 18 сентября 2008

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

0 голосов
/ 25 сентября 2008

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

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

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

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

0 голосов
/ 18 сентября 2008

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

http://freemarker.org/

...