如何使用string作为速度模板?
什么是从string创build速度模板的最佳方式?
我知道Velocity.evaluate方法,我可以传递string或StringReader,但我很好奇是否有更好的方法来做到这一点(例如创build模板的任何优势)。
有一些开销parsing模板。 如果您的模板很大,并且您反复使用,则可能会通过预parsing模板而看到一些性能提升。 你可以做这样的事情,
RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices(); StringReader reader = new StringReader(bufferForYourTemplate); SimpleNode node = runtimeServices.parse(reader, "Template name")); Template template = new Template(); template.setRuntimeServices(runtimeServices); template.setData(node); template.initDocument();
然后你可以反复调用template.merge()
而不必每次都parsing它。
顺便说一句,你可以直接传递string到Velocity.evaluate()
。
上面的示例代码正在为我工作。 它使用Velocity版本1.7和log4j。
private static void velocityWithStringTemplateExample() { // Initialize the engine. VelocityEngine engine = new VelocityEngine(); engine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.Log4JLogChute"); engine.setProperty("runtime.log.logsystem.log4j.logger", LOGGER.getName()); engine.setProperty(Velocity.RESOURCE_LOADER, "string"); engine.addProperty("string.resource.loader.class", StringResourceLoader.class.getName()); engine.addProperty("string.resource.loader.repository.static", "false"); // engine.addProperty("string.resource.loader.modificationCheckInterval", "1"); engine.init(); // Initialize my template repository. You can replace the "Hello $w" with your String. StringResourceRepository repo = (StringResourceRepository) engine.getApplicationAttribute(StringResourceLoader.REPOSITORY_NAME_DEFAULT); repo.putStringResource("woogie2", "Hello $w"); // Set parameters for my template. VelocityContext context = new VelocityContext(); context.put("w", "world!"); // Get and merge the template with my parameters. Template template = engine.getTemplate("woogie2"); StringWriter writer = new StringWriter(); template.merge(context, writer); // Show the result. System.out.println(writer.toString()); }
类似的问题。
Velocity 2可以集成到JSR223 Java脚本语言框架中 ,该框架提供了将string转换为模板的另一种select:
ScriptEngineManager manager = new ScriptEngineManager(); manager.registerEngineName("velocity", new VelocityScriptEngineFactory()); ScriptEngine engine = manager.getEngineByName("velocity"); System.setProperty(VelocityScriptEngine.VELOCITY_PROPERTIES, "path/to/velocity.properties"); String script = "Hello $world"; Writer writer = new StringWriter(); engine.getContext().setWriter(writer); Object result = engine.eval(script); System.out.println(writer);