0
点赞
收藏
分享

微信扫一扫

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

十日十月Freddie 2023-03-20 阅读 75


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");


模板中的内容我们就可以通过数据库读取出来



该实现虽然简单,不过我认为还是比较有用。


举报

相关推荐

0 条评论