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) {
-
- 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) {
-
-
- }
-
- @Override
- public boolean isSourceModified(Resource arg0) {
-
- 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);
-
-
- 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");
模板中的内容我们就可以通过数据库读取出来
该实现虽然简单,不过我认为还是比较有用。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。