How to use String template as Velocity?

What is the best way to create a Velocity template from a string?

I am aware of the Velocity.evaluate method where I can pass a String or StringReader, but I curios is the best way to do this (for example, any advantage of instantiating a template).

+49
java velocity
Sep 16 '09 at 11:44
source share
4 answers

There are several overhead parsing patterns. You can see some increase in productivity by pre-analyzing the template if your template is large and you are reusing it. 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(); 

You can then call template.merge() again and again, without parsing it every time.

BTW, you can pass String directly to Velocity.evaluate() .

+68
Sep 16 '09 at 12:12
source share
— -

The above code sample works 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 the question is.

+12
Mar 03 '16 at 15:07
source share

Velocity 2 can be integrated into the JSR223 Java Scripting Language Framework , which make another option for converting a string as a template:

 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); 
0
Oct 24 '17 at 11:10
source share
 RuntimeServices rs = RuntimeSingleton.getRuntimeServices(); StringReader sr = new StringReader("Username is $username"); SimpleNode sn = rs.parse(sr, "User Information"); Template t = new Template(); t.setRuntimeServices(rs); t.setData(sn); t.initDocument(); VelocityContext vc = new VelocityContext(); vc.put("username", "John"); StringWriter sw = new StringWriter(); t.merge(vc, sw); System.out.println(sw.toString()); 
0
Dec 02 '18 at 20:55
source share



All Articles