【问题标题】:Where does Velocity search for the template?Velocity 在哪里搜索模板?
【发布时间】:2010-07-12 13:55:09
【问题描述】:

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

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

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

此代码总是抛出ResourceNotFoundException。我应该将我的模板放在 web 应用程序中的什么位置(WEB-INF?类路径?等等?)以及我应该如何指定路径(即我应该将什么传递为 templatePath)?

【问题讨论】:

    标签: java velocity


    【解决方案1】:

    您需要首先通过调用Velocity.init()(在单例使用模型中)或VelocityEngine.init()(如果您使用单独的实例)来初始化Velocity,并传递适当的配置参数。其中包括resource loader configuration

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

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

    【讨论】:

    • 如何从 mongoDb 获取 .vm 模板?
    【解决方案2】:

    设置速度模板

    我最终使用这个问题来解决我设置模板路径的问题。我正在使用速度模板化 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;
    }
    

    如何使用上述代码,创建一个速度上下文以提供给实用程序方法

    以下是您可以使用上述方法的方法。您只需指定模板文件的文件名,并创建一个简单的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);
    

    示例模板 HTML

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-29
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多