velocity基础教程--2自定义ResourceLoader实现字符模板

velocity虽然已经为我们提供了一些资源加载器,基本已经可以满足大部分的用户需求。有的时候还需要我们必须手动去写一些,比如:我们打算采用String的模板而不是vm文件形式,为的是将模板存入db中。
这是我们只需要继承org.apache.velocity.runtime.resource.ResourceLoader 并实现我们想要的功能。
下面的例子就是拿上面的需求来进行一个简单的实现。

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.apache.commons.collections.ExtendedProperties;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.Resource;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;

public class MyResourceLoader extends ResourceLoader {

@Override
public long getLastModified(Resource arg0) {
// TODO Auto-generated method stub
return 0;
}

@Override
public InputStream getResourceStream(String arg0)
throws ResourceNotFoundException {
InputStream result = null;

if (arg0 == null || arg0.length() == 0) {
throw new ResourceNotFoundException(
"模板没有被定义~!");
}
result = new ByteArrayInputStream(arg0.getBytes());
return result;
}

@Override
public void init(ExtendedProperties arg0) {
// TODO Auto-generated method stub

}

@Override
public boolean isSourceModified(Resource arg0) {
// TODO Auto-generated method stub
return false;
}

}


我们只需实现getResourceStream方法就可以了。很简单吧
应用就更简单了,基本上和我们的上一个例子没有区别

import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

public class Simple2 {

/**
* 入门,自定义资源加载器
*/
public static void main(String[] args) {
// 创建引擎
VelocityEngine ve=new VelocityEngine();
Properties p=new Properties();
p.put("resource.loader","srl");
p.put("srl.resource.loader.class","test.velocity.MyResourceLoader");

try {
//进行初始化操作
ve.init(p);
//加载模板,设定模板编码
Template t=ve.getTemplate("你好 $name !\r\n$project project.","gbk");
//设置初始化数据
VelocityContext context = new VelocityContext();
context.put("name", "张三");
context.put("project", "Jakarta");
//设置输出
StringWriter writer = new StringWriter();
//将环境数据转化输出
t.merge(context, writer);
//简化操作
//ve.mergeTemplate("test/velocity/simple1.vm", "gbk", context, writer );
System.out.println(writer.toString());
} catch (Exception e) {
e.printStackTrace();
}

}

}


主要就是 p.put("resource.loader","srl");
p.put("srl.resource.loader.class","test.velocity.MyResourceLoader");
这两行,来定义资源加载器
这样Template t=ve.getTemplate("你好 $name !\r\n$project project.","gbk");
模板中的内容我们就可以通过数据库读取出来

该实现虽然简单,不过我认为还是比较有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值