velocity自定义resource loader

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()就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值