Каков наилучший способ создания шаблона Velocity из строки?
Мне известно о методе Velocity.evaluate, где я могу передать String или StringReader, но я curios - лучший способ сделать это (например, любое преимущество создания экземпляра шаблона).
Каков наилучший способ создания шаблона Velocity из строки?
Мне известно о методе Velocity.evaluate, где я могу передать String или StringReader, но я curios - лучший способ сделать это (например, любое преимущество создания экземпляра шаблона).
Существует несколько шаблонов синтаксического анализа накладных расходов. Вы можете увидеть некоторое увеличение производительности путем предварительного анализа шаблона, если ваш шаблон большой, и вы используете его повторно. Вы можете сделать что-то подобное,
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()
снова и снова, без разбора его каждый раз.
BTW, вы можете передать 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());
}
A аналогичный, так что вопрос.
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);
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());