Velocity在哪里搜索模板?设置速度模板

2022-09-02 21:30:07

我需要在Web应用程序中使用Java代码中的Velocity(我将其用作邮件模板处理器)。

所以,我有一个标准代码:

VelocityEngine ve = new VelocityEngine ();
try {
   ve.init ();
   Template t = ve.getTemplate (templatePath);
   ...   
} catch (Exception e) {
   throw new MailingException (e);
}

此代码始终抛出 .我应该将模板放在Web应用程序中的什么位置(WEB-INF?类路径?等),我应该如何指定路径(即我应该作为)传递什么?ResourceNotFoundExceptiontemplatePath


答案 1

设置速度模板

我最终使用这个问题来解决设置模板路径的问题。我正在使用速度来模板化html电子邮件。

以下是您可以使用的几种方法来说明如何设置模板路径。它将属性“file.resource.loader.path”设置为绝对路径。我为模板创建了一个目录,然后右键单击模板文件以获取完整路径(在 Eclipse 中)。您可以使用该完整路径作为 file.resource.loader.path 属性的值。我还添加了“runtime.log.logsystem.class”属性,并设置了它,因为我收到异常,抱怨日志记录。

实用速度方法

public static VelocityEngine  getVelocityEngine(){

    VelocityEngine ve = new VelocityEngine();
    Properties props = new Properties();
    // THIS PATH CAN BE HARDCODED BUT IDEALLY YOUD GET IT FROM A PROPERTIES FILE
    String path = "/absolute/path/to/templates/dir/on/your/machine";
    props.put("file.resource.loader.path", path);
    props.setProperty("runtime.log.logsystem.class", "org.apache.velocity.runtime.log.NullLogSystem");
    ve.init(props);
    return ve;
}

public static String getHtmlByTemplateAndContext(String templateName, VelocityContext context){

    VelocityEngine ve = getVelocityEngine();

    Template template = ve.getTemplate(templateName);

      StringWriter writer = new StringWriter();
      template.merge(context, writer );
      System.out.println( writer.toString());
      String velocityHtml = writer.toString();
      return velocityHtml;
}

如何使用上面的代码,创建一个速度上下文来馈送到UTILTY方法

以下是使用上述方法的方法。您只需指定模板文件的文件名,然后创建一个简单的上下文来存储模板变量。VelocityContext

        VelocityContext context = new VelocityContext();
        context.put("lastName", "Mavis");
        context.put("firstName", "Roger");
        context.put("email", "mrRogers@wmail.com");
        context.put("title", "Mr.");

        String html =    VelocityUtil.getHtmlByTemplateAndContext("email_template_2015_10_09.vm", context);

示例模板

变量可以像这样访问(在我的情况下保存在文件中):email_template_2015_10_09.vm

<p> Hello $firstName $lastName </p>

答案 2

您需要首先通过调用 Velocity.init()(在单例使用模型中)或 VelocityEngine.init()(如果使用单独的实例)来初始化 Velocity,然后传递适当的配置参数。其中包括资源加载程序配置

模板文件的位置取决于您选择的资源加载器 - 有文件,类路径,jar,url等可用的资源加载器。

如果使用文件资源加载程序,则模板路径应为绝对(目录/文件)路径。但是,对于 jar 资源加载程序,它不能是绝对路径(如果您的模板位于 jar 中,那就是)。对于模板中的链接也是如此,即,如果其中一个模板包含另一个绝对路径,则 jar 资源加载程序将无法加载它。


推荐