`

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");
模板中的内容我们就可以通过数据库读取出来

该实现虽然简单,不过我认为还是比较有用。
分享到:
评论
1 楼 924060929 2016-06-10  
我想找就是要这个功能!!!!!!!!

相关推荐

Global site tag (gtag.js) - Google Analytics