JSTL/JSP EL(表达式语言)在非JSP(独立)环境中的应用

13

有人可以推荐一个类似于JSP EL(表达式语言)的独立应用程序的模板/消息格式化框架吗?

我希望能够实例化某种对象,并为其提供类似于以下的模板:

Dear ${customer.firstName}. You order will be dispatched on ${order.estimatedDispatchDate}
提供一个上下文,其中包括参数对象的值字典(在这种情况下,比如一个名为'customer'的Customer类型对象和一个名为'order'的Order类型对象)。
我知道有很多模板框架-其中许多可以在Web应用程序上下文之外工作,但我并不认为这是一个笨重的模板框架。只是Java已经提供的基本Message Format功能的更好版本。
例如,我可以使用java.text.MessageFormat实现上述功能,只需使用模板(或者他们称之为'pattern'):
Dear {0}. You order will be dispatched on {1,date,EEE dd MMM yyyy}

我可以在调用Java程序时向其传递一个对象数组。

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

然而,在这种用法中,代码和模式是密切相关的。虽然我可以将模式放在资源属性文件中,但代码和模式需要彼此了解详细信息。使用类似EL的系统,代码和模式之间的合同将处于更高的级别(例如客户和订单,而不是customer.firstName和order.estimatedDispatchDate),这使得更容易改变消息的结构、顺序和内容,而不需要改变任何代码。

10个回答

12

你可以直接使用通用表达式语言。你需要一个实现(但是有几个可以选择)。之后,你需要实现三个类:ELResolver、FunctionMapper和VariableMapper。

这篇博客文章描述了如何做到这一点:Java:在J2EE之外使用EL


谢谢。看起来非常有用。不幸的是,我尝试快速替换基于MessageFormat的代码失败了,因为我正在使用Java 1.4(Jasper和Juel都是为1.5编译的)。我可能会尝试找到旧版本,或从源代码构建自己的JAR。 - Vihung

4

StringTemplate 是一个比 Velocity 和 Freemarker 更轻量级的替代品。


3
我建议您了解一下Apache Velocity。它非常简单和轻量级。
我们目前正在使用它来制作电子邮件模板,效果非常好。

1
我认为Velocity对于这个任务来说太重了 - 记住我是在与Java MessageFormat进行比较。 - Vihung

2

你可以像jsp一样轻松使用Casper: Casper


2
使用EL本身在Java EE之外的想法是由Ed Burns提倡并在The Server Side上进行了讨论。Tomcat的实现以一个单独的JAR包发行,但我不知道它是否可以在服务器之外使用。

2
我建议使用Spring表达式语言:
一些示例展示了它的强大功能(前两个来自文档): 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 ?"

1
你可能想要看看 OGNL ,这是你需要的那种库。 OGNL 可以相当强大,并且是 WebWork Web 框架中使用的表达式语言。

1

0

啊。而使用MessageFormat,我可以这样做

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

其中参数#1是一个日期对象,并按照指定的格式进行格式化,但在EL中没有相应的功能。

在JSP中,我可能会使用格式化标签。在这个独立的示例中,我需要在代码中将日期格式化为字符串,然后再评估表达式。


0

Freemarker 可以完全满足您的需求。它是一个模板引擎,其语法非常类似于 JSP:

http://freemarker.org/


我认为Freemarker对于这个任务也有点太重了(请参见先前关于Velocity的评论)-记住我是与Java MessageFormat进行比较。 - Vihung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接