大多数程序都需要输出一些文本,比如邮件消息、HTML文件或控制台输出。但是,
计算机本质上只能处理二进制数据,
程序员必须让软件来生成可理解的文本。在这篇文章中,我要介绍的是在生成和输出文本时,为何使用模板引擎能够节省时间。你将了解模板的优点,如何针对不同的情形创建高效的
模板。和System.println说再见!
虽然程序员可以很轻松地编写出输出文字信息的代码(因为这毕竟是从Hello World范例学到的第一件事情),但通常而言,程序员不是写作或组织文字信息(如邮件)的最佳人选。因此,我们常常让市场部门或公关部门去做那些事情。但遗憾的是,即使对于最普通的邮件,编写者也常常依赖程序输出来完成任务。无论是对于邮件编写者还是
程序员,这种合作方式都很容易带来误解和造成失误。
请看一个例子:一个Java程序从某个数据源收集一些客户信息,通过email给公司的每一个客户发送帐户余额信息。下面是完成这个任务的Java程序(完整的示例
程序代码可以从本文最后
下载):
for (int i=0; i { Customer customer = (Customer)customers.get(i); StringBuffer message = new StringBuffer(); message.append ("尊敬的先生/女士: "); message.append (customer.getCustName()); message.append ("\n"); message.append ("\n"); message.append ("您的帐户余额是 "); message.append (customer.getAccountTotal()); message.append ("\n"); message.append ("\n"); message.append ("致礼!"); message.append ("\n"); message.append ("某某装饰品公司"); // 发送email mm.sendMail (customer.getFirstName(), customer.getEmail(), "Account", message.toString()); }
上面的例子可谓发送消息最差劲的方法之一。由于消息嵌入到了程序代码之中,如果没有程序员的帮助,其他人几乎不可能对消息进行编辑。同时,即使对于专业的
程序员,如果他不了解代码,要进行编辑也很困难。如果你预见了这些麻烦,把代码写成下面这种形式:
static public final String STR_HELLO="尊敬的先生/女士: "; static public final String STR_MESSAGE="您的帐户余额是 "; static public final String STR_BEY="致礼!\n某某装饰品公司";
如果说上述代码使得消息编辑更容易,那么这种帮助也不会很多。很难要求一个不搞
程序设计的人理解static和final的含义。此外,如果要改变消息的结构,上面这种代码也不够灵活。例如,人们可能要求你在邮件消息中加入更多来自数据源的信息,这时,你就得修改构造邮件的代码,或许还要添加更多的static final String对象。
模板简介
从文本文件装入消息文本可以解决部分
问题——但不能提供动态内容,而这对于系统来说是很重要的。你需要有一种方法把动态内容插入到预先编写好的文本消息。但是,如果使用某种文本
模板引擎,它就能够帮助你完成所有复杂的工作。
模板引擎解决了把动态内容插入文本消息的问题。使用模板引擎时,我们不再把消息直接嵌入
程序,而是创建一个包含文本内容的简单文本文件,称为“文本模板”。模板引擎解析文本模板,借助一些简单的模板指令,把动态内容插入
模板输出结果。
我选择的模板引擎是Jakarta Project的Velocity,但你可以任意选择其他许多模板引擎之一。Velocity和WebMacro或许是当前功能最丰富、最受欢迎的两个引擎,而且两者都按照源代码开放协议免费提供。虽然我在本文例子中使用Velocity,你可以方便地把这些例子移植到不同的
模板引擎,只需遵照目标引擎的语法即可。
我们来看看用Velocity完成的email