velocity模板引擎学习(4)-在standalone的java application中使用velocity及velocity-tools

通常velocity是配合spring mvc之类的框架在web中使用,但velocity本身其实对运行环境没有过多的限制,在单独的java application中也可以独立使用,下面演示了利用velocity模板引擎生成 『每日发货单』邮件内容:

一、先定义邮件内容模板:mail-template.vm

<string>用户,您好:</string>
<h2>以下是 $date.format('yyyy-MM-dd',$model.deliverDate,$convert.toLocale("en_US")) 的发货清单,请核对!</h2>
<ul>
    #foreach ($item in $model.items)
        <li>$velocityCount . $item.productName / $item.productNum 件</li>
    #end
</ul>

这里面涉及到二个java类:Order(发货订单)及OrderItem(订单明细)

import java.util.Date;
import java.util.List;


public class Order {

    private Date deliverDate;

    private List<OrderItem> items;

    public Date getDeliverDate() {
        return deliverDate;
    }

    public void setDeliverDate(Date deliverDate) {
        this.deliverDate = deliverDate;
    }

    public List<OrderItem> getItems() {
        return items;
    }

    public void setItems(List<OrderItem> items) {
        this.items = items;
    }
}

public class OrderItem {

    private String productName;
    private int productNum;

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public int getProductNum() {
        return productNum;
    }

    public void setProductNum(int productNum) {
        this.productNum = productNum;
    }
}

二、使用示例

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import org.apache.velocity.tools.generic.ConversionTool;
import org.apache.velocity.tools.generic.DateTool;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;


public class VelocityTest {

    public static void main(String[] args) {        

        VelocityEngine ve = new VelocityEngine();
        //定义vm资源加载的路径为classpath所在目录
        ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

        ve.init();

        //加载模板
        Template t = ve.getTemplate("mail-template.vm", "utf-8");
        VelocityContext ctx = new VelocityContext();

        //加载velocity-tools
        ctx.put("date", new DateTool());
        ctx.put("convert", new ConversionTool());

        //放入要绑定的对象
        ctx.put("model", getOrder());

        StringWriter sw = new StringWriter();

        t.merge(ctx, sw);

        //输出
        System.out.println(sw.toString());
    }

    private static Order getOrder() {

        Order o = new Order();
        o.setDeliverDate(new Date());
        o.setItems(new ArrayList<OrderItem>());

        OrderItem item1 = new OrderItem();
        item1.setProductName("iphone");
        item1.setProductNum(1);

        OrderItem item2 = new OrderItem();
        item2.setProductName("mac pro");
        item2.setProductNum(2);

        o.getItems().add(item1);
        o.getItems().add(item2);

        return o;
    }
}

运行的输出结果:

<string>用户 您好:</string>
<h2>以下是 2015-09-12 的发货清单,请核对!</h2>
<ul>
            <li>1 . iphone / 1 件</li>
            <li>2 . mac pro / 2 件</li>
    </ul>

参考文章:

http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/index.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

我这么玩Web Api(二)

数据验证,全局数据验证与单元测试 目录 一、模型状态 - ModelState 二、数据注解 - Data Annotations 三、自定义数据注解 四、全局...

5386
来自专栏积累沉淀

Java设计模式(十九)----备忘录模式

备忘录模式 一、 概念 二、 结构 三、 分类 1.”白箱”备忘录模式的实现 2.“黑箱”备忘录模式的实现 3.“多重”检查点 4....

1999
来自专栏菩提树下的杨过

Flash/Flex学习笔记(46):正向运动学

所谓"正向运动学"通俗点讲就是把几个连接部件的一端固定起来,另一个端可以自由(向前/向外)运动。比如人的行走,单个下肢可以理解为脚连接小腿,小腿连接大腿,大腿连...

2256
来自专栏海说

12、借助Jacob实现Java打印报表(Excel、Word)

12、使用Jacob来处理文档   Word或Excel程序是以一种COM组件形式存在的。如果能够在Java中调用相应组件,便能使用它的方法来获取文档中的文本信...

5450
来自专栏跟着阿笨一起玩NET

C#FTP下载文件出现远程服务器返回错误: (500) 语法错误,无法识别命令

如果下载多个文件的时候,有时候莫名其妙的出现500服务器错误,很有可能是没有设置KeepAlive 属性导致的。

2991
来自专栏Android 研究

Android Handler机制4之Looper与Handler简介

要理解Handler的消息机制,就不得不说Handler/Looper/Message/MessageQueue/Message这四4个类,下面我们先大概了解下...

1143
来自专栏Java架构师学习

Zookeeper-watcher机制源码分析(二)

其大致流程如下   ① 通过传入的path(节点路径)从watchTable获取相应的watcher集合,进入②

1531
来自专栏Golang语言社区

50. RESTful API的简单实现 | 厚土Go学习笔记

RESTfull API是现在很流行的 API 设计风格。众所周知的 HTTP 1.1规范正是基于 REST 架构风格的指导原理来设计的。需要注意的是,REST...

2874
来自专栏chenssy

【追光者系列】HikariCP源码分析之evict、时钟回拨、连接创建生命周期

evict定义在com.zaxxer.hikari.pool.PoolEntry中,evict的汉语意思是驱逐、逐出,用来标记连接池中的连接不可用。

4264
来自专栏ascii0x03的安全笔记

C/C++网络编程时注意的问题小结

1.网络编程在自己定义结构体实现协议的时候,一定要注意字节对齐这个问题。否则sizeof和强制转换指针的时候都会出现很难发现的bug。 什么是字节对齐自行百度。...

3639

扫码关注云+社区

领取腾讯云代金券