2009-09-16 5 views
47

Was ist der beste Weg, Velocity Template aus einem String zu erstellen?Wie verwende ich String als Velocity Template?

Ich bin bewusst, Velocity.evaluate Methode, wo ich Zeichenfolge oder StringReader übergeben kann, aber ich bin Kuriositäten gibt es eine bessere Möglichkeit, es zu tun (z. B. einen Vorteil der Erstellung einer Instanz von Vorlage).

Antwort

64

Es gibt einige Overhead-Analysevorlage. Wenn die Vorlage groß ist und Sie sie wiederholt verwenden, kann es zu Leistungssteigerungen kommen, wenn Sie die Vorlage vorlesen. Sie können etwas tun,

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(); 

Dann können Sie template.merge() immer und immer wieder aufrufen, ohne sie jedes Mal das Parsen.

Übrigens können Sie String direkt an Velocity.evaluate() übergeben.

+0

Genau das, was ich suchte. Vielen Dank. Für andere Personen ist runtimeServices eine Instanz von org.apache.velocity.runtime.RuntimeInstance – tomsame

+0

Verpasste einzeilige. Der Vollständigkeit halber habe ich es hinzugefügt. –

+12

+1 für die Erwähnung von Velocity.Evaluate da genau das, was ich gesucht habe. –

10

Der obige Beispielcode funktioniert für mich. Es verwendet Velocity Version 1.7 und 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 Frage.

+0

Wow, das ist ein einzigartiger Ansatz. Wie scheint die Geschwindigkeit der Engine Load Ressource ist interne Implementierung, könnte Eigenschaft "string.resource.loader.class" Änderung unterliegen? –

0

Geschwindigkeit 2 in die JSR223 Java Scripting Language Framework, die eine andere Option machen integriert werden Zeichenfolge als Vorlage zu verwandeln:

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);