Как использовать строку в качестве шаблона скорости? - PullRequest
50 голосов
/ 16 сентября 2009

Каков наилучший способ создания шаблона скорости из строки?

Мне известен метод Velocity.evaluate , в котором я могу передать String или StringReader, но мне интересно, есть ли лучший способ сделать это (например, любое преимущество создания экземпляра Template) .

Ответы [ 4 ]

72 голосов
/ 16 сентября 2009

Есть некоторый шаблон синтаксического анализа. Вы можете увидеть некоторое повышение производительности, предварительно проанализировав шаблон, если ваш шаблон большой и вы используете его несколько раз. Вы можете сделать что-то вроде этого,

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() снова и снова, не анализируя его каждый раз.

Кстати, вы можете передать строку напрямую Velocity.evaluate().

16 голосов
/ 03 марта 2016

Приведенный выше пример кода работает для меня. Он использует 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());
}

A похоже так что вопрос.

0 голосов
/ 02 декабря 2018
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 голосов
/ 24 октября 2017

Velocity 2 может быть интегрирован в JSR223 Java Scripting Language Framework , который предоставляет другую опцию для преобразования строки в шаблон:

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