Apache Velocity 2.0 如何编写自定义资源加载器?



API 文档中有一个ResourceLoader类:

https://velocity.apache.org/engine/2.0/apidocs/org/apache/velocity/runtime/resource/loader/ResourceLoader.html

我想实现我自己的加载器,因为我需要从数据库加载模板,但以上下文敏感的方式(换句话说:不能使用数据源资源加载器,我需要编写自定义代码以从数据库中选择"正确"的模板(。

似乎ResourceLoader有一些抽象方法,而且似乎我也能够通过实现这些抽象方法编写自定义加载器。但是我看不到任何方法可以在引擎中添加新的装载机。没有"addResourceLoader"方法。该文档仅显示如何配置内置于 Velocity 中的加载程序:

https://velocity.apache.org/engine/2.0/developer-guide.html#resource-loaders

主要问题:如何将自定义资源加载器添加到 VelocityEngine(或 VelocityContext?

另一个侧面问题:我想关闭所有内置加载器。特别是默认情况下处于活动状态WebappResourceLoader,并且在我的特定应用程序中表示安全风险。怎么做?

我无法回答如何实现自己的资源加载器,但第二部分非常简单:

创建 VelocityEngine 时,可以传递定义资源加载程序"类路径"的属性

不同的类装入器由属性键的前缀标识。所以像这样:

Properties props = new Properties();
// Add a default class path resource loader - just an example
props.setProperty("cp.resource.loader.class", ClasspathResourceLoader.class.getName());
props.setProperty("cp.resource.loader.cache", "true");
// Add your own resource loader
props.setProperty("db.resource.loader.class", MyDBResourceLoader.class.getName());
props.setProperty("db.resource.loader.cache", "false");
// Define the "class path" for the loaders
// in this case first the "db" loader is asked for resources, if nothing is found the "cp" loader
props.setProperty(RuntimeConstants.RESOURCE_LOADER, "db,cp");
// Now create the engine
VelocityEngine engine = new VelocityEngine(props);

上面只为该引擎定义了两个资源加载器,该引擎实例不会使用其他加载程序(包括默认加载程序(。

您必须首先实现 ResourceLoader 接口(或子类化现有的资源加载器(,然后在velocity.properties中声明您的资源加载器:

resource.loader = .... , my_loader, ...
my_loader.resource.loader.class = com.foo.MyResourceLoader
my_loader.resource.loader.some_property = some_value
... other properties...

请注意,配置属性语法在版本 2.1 中发生了一些更改。虽然旧语法仍然有效,但如果您想避免日志中的弃用警告,它是:

resource.loaders = .... , my_loader, ...
resource.loader.my_loader.class = com.foo.MyResourceLoader
resource.loader.m_loader.some_property = some_value
... other properties...

具有资源加载器接口有四个需要提供的抽象方法:

  • configuration对象包含some_property -> some_value属性对的void init(ExtProperties configuration)
  • long getLastModified(Resource resource)返回自修改资源以来的秒数
  • Reader getResourceReader(String source, String encoding)获取资源的实际内容
  • boolean isSourceModified(Resource resource)

最新更新