从String创建Velocity模板的最佳方法是什么?
我知道Velocity.evaluate方法,我可以传递String或StringReader,但我很好,有更好的方法(例如创建模板实例的任何优点).
有一些开销解析模板.如果模板很大并且重复使用模板,则可能会通过预解析模板看到一些性能提升.你可以这样做,
RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices(); StringReader reader = new StringReader(bufferForYourTemplate); Template template = new Template(); template.setRuntimeServices(runtimeServices); /* * The following line works for Velocity version up to 1.7 * For version 2, replace "Template name" with the variable, template */ template.setData(runtimeServices.parse(reader, "Template name"))); template.initDocument();
然后你可以template.merge()
反复调用而不必每次解析它.
顺便说一句,你可以直接传递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()); }
一个类似的问题.