What is the best way to create Velocity Template from a String?
I'm aware of Velocity.evaluate method where I can pass String or StringReader, but I'm curios is there a better way to do it (e.g. any advantage of creating an instance of Template).
3.2 Create a Velocity Template Writer Initialize the Velocity engine. Read the template. Put the data model in a context object. Merge the template with context data and render the view.
Velocity is a server-side template language used by Confluence to render page content. Velocity allows Java objects to be called alongside standard HTML. If you are are writing a user macro or developing a plugin you may need to modify Velocity content.
In the code you posted: there 2 ways to run velocity: running the main (but this is not what you do when you build your project) running ant form but since you don't fill any velocity context: velocity won't be able to replace the variable in your template (i.e. the generated html won't contains dynamic data)
There is some overhead parsing template. You might see some performance gain by pre-parsing the template if your template is large and you use it repeatedly. You can do something like this,
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();
Then you can call template.merge()
over and over again without parsing it everytime.
BTW, you can pass String directly to Velocity.evaluate()
.
The above sample code is working for me. It uses Velocity version 1.7 and 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()); }
A similar so question.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With