如何从 Java 调用存储在 Velocity 模板中的velocityMacro

发布于 2024-12-11 03:44:29 字数 1149 浏览 0 评论 0原文

我想从我的 Java 应用程序调用 Velocity 模板文件中定义的宏。

例如,我在名为 helloworld.vm 的模板文件中定义了以下宏:

#macro( print $msg $n )
#foreach( $i in [1..$n] )
Hello ${msg}!
#end
#end

然后,我想使用速度引擎来执行特定的宏:

velocityEngine = new VelocityEngine();
velocityEngine.setProperty("resource.loader", "class");
velocityEngine.setProperty("class.resource.loader.class", ClassLoaderResourceLoader.class.getName());
velocityEngine.setProperty("class.resource.loader.classloader", this.classLoader);
velocityEngine.setProperty("class.resource.loader.location", "PATH_TO_TEMPLATE_DIRECTORY");
velocityEngine.init();

velocityContext = new VelocityContext();
StringWriter sw = new StringWriter();

velocityContext.put("msg", "Tom");
velocityContext.put("n", 2);
velocityEngine.invokeVelocimacro("print", "print", new String[]{"msg","n"}, velocityContext, sw);

我希望将其提供给 sw 类似:

Hello Tom!
Hello Tom!

而是产生以下错误:

RuntimeInstance.invokeVelocimacro() : VM 'print' is not registered.

因此,注册速度宏的过程是什么,或者是否有其他方法从 Java 调用存储在自定义模板文件中的速度宏?

I would like to invoke a macro defined in a Velocity template file from my Java application.

For example, I defined the following macro in a template file named helloworld.vm:

#macro( print $msg $n )
#foreach( $i in [1..$n] )
Hello ${msg}!
#end
#end

And then, I would like to use the velocity engine to execute a specific macro:

velocityEngine = new VelocityEngine();
velocityEngine.setProperty("resource.loader", "class");
velocityEngine.setProperty("class.resource.loader.class", ClassLoaderResourceLoader.class.getName());
velocityEngine.setProperty("class.resource.loader.classloader", this.classLoader);
velocityEngine.setProperty("class.resource.loader.location", "PATH_TO_TEMPLATE_DIRECTORY");
velocityEngine.init();

velocityContext = new VelocityContext();
StringWriter sw = new StringWriter();

velocityContext.put("msg", "Tom");
velocityContext.put("n", 2);
velocityEngine.invokeVelocimacro("print", "print", new String[]{"msg","n"}, velocityContext, sw);

Which I would expect to feed sw with something like:

Hello Tom!
Hello Tom!

But rather produces the following error:

RuntimeInstance.invokeVelocimacro() : VM 'print' is not registered.

Therefore, what is the procedure for registering a velocityMacro or is there any other way of invoking a Velocity macro stored in a custom template file from Java?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

佞臣 2024-12-18 03:44:29

我相信您还需要指定属性 resource.loader=class 以便 Velocity 使用基于类加载器的加载器。

请参阅 ClasspathResourceLoader< /code>javadocs

另外,这个模板文件实际上在类路径中吗?

I believe you need to also specify the property resource.loader=class in order for Velocity to use the classloader-based loader.

See the ClasspathResourceLoader javadocs.

In addition, is this template file actually on the classpath?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文