用Java程序生成文本的捷径(转)-创新互联
用J in
- ”。#foreach指令迭代list,把list中的每个元素放入item参数,然后解析#foreach块内的内容。对于 list内的每个元素,#foreach块的内容都会重复解析一次。从效果上看,它相当于告诉模板引擎说:“把list中的每一个元素依次放入item变量,每次放入一个元素,输出一次#foreach块的内容”。 MVC设计模型在看下一个例子之前,请回顾一下前面我们所讨论的内容。使用模板引擎大的好处在于,它分离了代码(或程序逻辑)和表现(输出)。由于这种分离,你可以修改程序逻辑而不必担心邮件消息本身;类似地,你(或公关部门的职员)可以在不重新编译程序的情况下,重新编写邮件消息。 实际上,我们分离了系统的数据模式(Data Model,即提供数据的类)、控制器(Controller,即邮件程序)以及视图(View,即模板)。这种三层体系称为Model-View- Controller模型(MVC)。如果遵从MVC模型,代码分成三个截然不同的层,简化了软件开发过程中所有相关人员的工作(MVC的出现已经有一段时间,参见本文最后的“参考资源”了解更多信息)。 结合模板引擎使用的数据模式可以是任何Java对象,最好是使用Java Collection Framework的对象。控制器只要了解模板的环境(如VelocityContext),一般这种环境都很容易使用。一些关系数据库的“对象-关系” 映射工具能够和模板引擎很好地协同,简化JDBC操作;对于EJB,情形也类似。 模板引擎与MVC中视图这一部分的关系更为密切。模板语言的功能很丰富、强大,足以处理所有必需的视图功能,同时它往往很简单,不熟悉编程的人也可以使用它。模板语言不仅使得设计者从过于复杂的编程环境中解脱出来,而且它保护了系统,避免了有意或无意带来危险的代码。例如,模板的编写者不可能编写出导致无限循环的代码,或侵占大量内存的代码。不要轻估这些安全机制的价值;大多数模板编写者不懂得编程,从长远来看,避免他们接触复杂的编程环境相当于节省了你自己的时间。 许多模板引擎的用户相信,在采用模板引擎的方案中,控制器部分和视图部分的明确分离,再加上模板引擎固有的安全机制,使得模板引擎足以成为其他内容发布系统(比如JSP)的替代方案。因此,Java模板引擎最常见的用途是替代JSP也就不足为奇了。 HTML处理由于人们总是看重模板引擎用来替换JSP的作用,有时他们会忘记模板还有更广泛的用途。到目前为止,模板引擎最常见的用途是处理HTML Web内容。但我还用模板引擎生成过SQL、email、XML甚至Java源代码。在这里我只能涉及模板的部分应用,但你可以从本文最后的参考资源找到更多的例子。 我将在下面的HTML例子中使用前面email例子的数据模式。这个HTML页面是一个假想的企业Intranet页面,它显示出客户帐户的详细信息。本例中的控制器类是一个Java Servlet,视图部分则包含一个HTML模板。下面的代码显示了Servlet类中最主要的代码。为使这个例子更具有代表性,我从头开始手工编写这个 Servlet。然而,一般情况下,模板会提供一些Servlet工具,帮助用户减轻一些编写代码的负担。 // 装入模板 Template template = Velocity.getTemplate("html.vm"); // 创建环境 VelocityContext context = new VelocityContext(); context.put ("customers",Customer.getCustomers());// 解析模板,输出应答ServletOutputStream output = response.getOutputStream();Writer writer = new OutputStreamWriter (output);template.merge(context, writer);writer.flush(); 这个例子也没有什么令人惊异的地方。和前面的例子一样,我只是把必需的对象加入到VelocityContext,然后输出解析模板的结果。但是请注意,在前面的例子中,我只把一个Customer加入到VelocityContext,这里加入到VelocityContext的却是一组 Customer对象。我可以用#foreach指令迭代访问所有的Customer对象。下面是相应的HTML模板:
客户报告
#foreach ($customer in $customers)$customer.CustName
$transaction.Date 当前文章:用Java程序生成文本的捷径(转)-创新互联 浏览路径:http://tyjierui.cn/article/epcej.html |