【发布时间】:2011-06-02 15:08:06
【问题描述】:
我需要模板化一些电子邮件文本。没什么花哨的,只需用真正的价值替换 @name@ 之类的东西。没有图片,没有花哨的格式等。
你能推荐什么java lib?越简单越好。
【问题讨论】:
我需要模板化一些电子邮件文本。没什么花哨的,只需用真正的价值替换 @name@ 之类的东西。没有图片,没有花哨的格式等。
你能推荐什么java lib?越简单越好。
【问题讨论】:
已建议的库的无库替代方案:java.text.MessageFormat。
【讨论】:
StringTemplate 是另一种选择。 five-minute introduction 给出了一些基本的例子和语法。
StringTemplate hello = new StringTemplate("Hello, $name$",
DefaultTemplateLexer.class);
hello.setAttribute("name", "World");
System.out.println(hello.toString());
【讨论】:
您可以试一试Velocity 或Freemarker。我在电子邮件模板引擎中都使用过。它们为基本用例提供了简单的语法,但您以后可能会变得相当复杂!
在这两者中,我个人更喜欢 Freemarker,因为它们在提供各种不同的内置功能方面做得非常好,这些内置功能使格式化数字和文本变得非常简单。
【讨论】:
你试过Apache Velocity吗?
【讨论】:
试试 Apache Velocity 或 FreeMarker,它们会很有帮助,对我来说我正在使用 FreeMarker
【讨论】:
自己做很简单:
public class Substitution {
public static void main(String[] args) throws Exception {
String a = "aaaa@bbb@ccc";
// This can be easiliy FileReader or any Reader
Reader sr = new StringReader(a);
// This can be any Writer (ie FileWriter)
Writer wr = new StringWriter();
for (;;) {
int c = sr.read();
if (c == -1) { //EOF
break;
}
if (c == '@') {
String var = readVariable(sr);
String val = getValue(var);
wr.append(val);
}
else {
wr.write(c);
}
}
}
/**
* This finds the value from Map, or somewhere
*/
private static String getValue(String var) {
return null;
}
private static String readVariable(Reader sr)throws Exception {
StringBuilder nameSB = new StringBuilder();
for (;;) {
int c = sr.read();
if (c == -1) {
throw new IllegalStateException("premature EOF.");
}
if (c == '@') {
break;
}
nameSB.append((char)c);
}
return nameSB.toString();
}
}
你必须稍微打磨一下,但仅此而已。
【讨论】:
同意,Apache 的 Velocity 非常适合嵌入式情况。
如果你想要一个独立的产品,你也可以使用 Apache 的 Ant。它通过应用替换过滤器来减少复制任务中的模板。
【讨论】: