velocity在1.5中提供了6种资源加载器,已经足够满足大多数的需求,当然,如果你觉得这些都不适用,你也可以自己实现一个。
实现一个资源加载器,实际上很简单,只要继承ResourceLoader,实现它的几个方法就可以了。
下面是一个简单的例子,它展示了如何实现一个最简单的ResourceLoader。
package org.sivasoft.viework.velocity.resource.loader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.commons.collections.ExtendedProperties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.Resource;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
public class TestResourceLoader extends ResourceLoader {
private static Log log = LogFactory.getLog(TestResourceLoader.class);
/**
* 得到资源流的最后修改时间
*
* @param resource
* @return Time in millis when the resource has been modified.
*/
@Override
public long getLastModified(Resource arg0) {
return 0;
}
/**
* 得到一个资源输入流。
*
* @param source
* @return The input stream for the requested resource.
* @throws ResourceNotFoundException
*/
@Override
public InputStream getResourceStream(String name)
throws ResourceNotFoundException {
if (name == null || name.length() == 0) {
throw new ResourceNotFoundException(
"Need to specify a template name!");
}
// 得到一个资源流,这里为了简单,使用了一个固定的String,实际上并不会如此使用。
String str = "Hello $name";
try {
return new ByteArrayInputStream(str.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {// 这个异常应该不会发生。
log.error(e);
throw new RuntimeException(e);
}
}
/**
* 初始化资源加载器 a resources class.
*
* @param configuration
*/
@Override
public void init(ExtendedProperties arg0) {
if (log.isTraceEnabled()) {
log.trace("TestResourceLoader : initialization complete.");
}
}
/**
* 检查资源是否被修改。
*
* @param resource
* @return True if the resource has been modified.
*/
@Override
public boolean isSourceModified(Resource arg0) {
return false;
}
}
很简单,只要做一点小小的开发,你就可以自己管理资源加载。
再来看看如何使用这个加载器:
//代码省略掉了所有try catch
Properties p = new Properties();
p.setProperty("resource.loader", "test");//给你的加载器随便取个名字
p.setProperty("test.resource.loader.class","org.sivasoft.viework.velocity.resource.loader.TestResourceLoader");//配置一下你的加载器实现类
p.setProperty("input.encoding", "UTF-8");
p.setProperty("output.encoding", "UTF-8");
VelocityEngine ve = new VelocityEngine();
ve.init(p);
String velocityTemplate = vm;
Template template = null;
template = ve.getTemplate("随便一个String", "UTF-8");
VelocityContext context = new VelocityContext();
context.put("name","Siva");
FileOutputStream fos = new FileOutputStream("d:\test.txt");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
template.merge(context, writer);
writer.close();
fos.close();
运行代码(需要给它加上异常处理),可以看到D盘根目录下生成了一个文件,打开看看,是不是Hello Siva。
可以看到,实现一个最简单的资源加载器,我们只要继承ResourceLoader并实现getResourceStream()就可以了。