`

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

该实现虽然简单,不过我认为还是比较有用。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics