How to use String as Velocity Template?

后端 未结 5 1521
庸人自扰
庸人自扰 2020-12-08 03:48

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 cur

相关标签:
5条回答
  • 2020-12-08 04:19

    Velocity 2 can be integrated into the JSR223 Java Scripting Language Framework which make another option to transform 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 讨论(0)
  • 2020-12-08 04:23

    This works in Velocity 2.1

    // Initialize the engine
    VelocityEngine velocityEngine = new VelocityEngine();
    velocityEngine.setProperty(Velocity.RESOURCE_LOADERS, "string");
    velocityEngine.setProperty("resource.loader.string.class", StringResourceLoader.class.getName());
    velocityEngine.init();
    
    // Add template to repository
    StringResourceRepository repository = StringResourceLoader.getRepository()
    repository.putStringResource("hello_world", "Hello $w");
    
    // Set parameters
    VelocityContext context = new VelocityContext();
    context.put("w", "world!");
    
    // Process the template
    StringWriter writer = new StringWriter();
    velocityEngine.getTemplate('hello_world').merge( context, writer );
    
    System.out.println(writer.toString());
    
    0 讨论(0)
  • 2020-12-08 04:25

    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.

    0 讨论(0)
  • 2020-12-08 04:33
    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 讨论(0)
  • 2020-12-08 04:39

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

    0 讨论(0)
提交回复
热议问题