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

来源:互联网 发布:安卓机推荐2017 知乎 编辑:程序博客网 时间:2024/04/27 20:41
velocity虽然已经为我们提供了一些资源加载器,基本已经可以满足大部分的用户需求。有的时候还需要我们必须手动去写一些,比如:我们打算采用String的模板而不是vm文件形式,为的是将模板存入db中。 
这是我们只需要继承org.apache.velocity.runtime.resource.ResourceLoader 并实现我们想要的功能。 
下面的例子就是拿上面的需求来进行一个简单的实现。 
Java代码  收藏代码
  1. import java.io.ByteArrayInputStream;  
  2. import java.io.InputStream;  
  3.   
  4. import org.apache.commons.collections.ExtendedProperties;  
  5. import org.apache.velocity.exception.ResourceNotFoundException;  
  6. import org.apache.velocity.runtime.resource.Resource;  
  7. import org.apache.velocity.runtime.resource.loader.ResourceLoader;  
  8.   
  9. public class MyResourceLoader extends ResourceLoader {  
  10.   
  11.     @Override  
  12.     public long getLastModified(Resource arg0) {  
  13.         // TODO Auto-generated method stub  
  14.         return 0;  
  15.     }  
  16.   
  17.     @Override  
  18.     public InputStream getResourceStream(String arg0)  
  19.             throws ResourceNotFoundException {  
  20.         InputStream result = null;  
  21.   
  22.         if (arg0 == null || arg0.length() == 0) {  
  23.             throw new ResourceNotFoundException(  
  24.                     "模板没有被定义~!");  
  25.         }  
  26.         result = new ByteArrayInputStream(arg0.getBytes());  
  27.         return result;  
  28.     }  
  29.   
  30.     @Override  
  31.     public void init(ExtendedProperties arg0) {  
  32.         // TODO Auto-generated method stub  
  33.   
  34.     }  
  35.   
  36.     @Override  
  37.     public boolean isSourceModified(Resource arg0) {  
  38.         // TODO Auto-generated method stub  
  39.         return false;  
  40.     }  
  41.   
  42. }  

我们只需实现getResourceStream方法就可以了。很简单吧 
应用就更简单了,基本上和我们的上一个例子没有区别 
Java代码  收藏代码
  1. import java.io.StringWriter;  
  2. import java.util.Properties;  
  3.   
  4. import org.apache.velocity.Template;  
  5. import org.apache.velocity.VelocityContext;  
  6. import org.apache.velocity.app.VelocityEngine;  
  7.   
  8. public class Simple2 {  
  9.   
  10.     /** 
  11.      * 入门,自定义资源加载器 
  12.      */  
  13.     public static void main(String[] args) {  
  14.         // 创建引擎  
  15.         VelocityEngine ve=new VelocityEngine();  
  16.         Properties   p=new   Properties();      
  17.         p.put("resource.loader","srl");    
  18.         p.put("srl.resource.loader.class","test.velocity.MyResourceLoader");    
  19.          
  20.         try {  
  21.             //进行初始化操作  
  22.             ve.init(p);  
  23.             //加载模板,设定模板编码  
  24.             Template t=ve.getTemplate("你好 $name !\r\n$project project.","gbk");  
  25.             //设置初始化数据  
  26.             VelocityContext context = new VelocityContext();  
  27.             context.put("name""张三");  
  28.             context.put("project""Jakarta");  
  29.             //设置输出  
  30.             StringWriter writer = new StringWriter();  
  31.             //将环境数据转化输出  
  32.             t.merge(context, writer);  
  33.             //简化操作  
  34.             //ve.mergeTemplate("test/velocity/simple1.vm", "gbk", context, writer );  
  35.             System.out.println(writer.toString());  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.           
  40.     }  
  41.   
  42. }  

主要就是 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 0
原创粉丝点击