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
として何を渡す必要がありますか)?
最初にVelocityを初期化するには、 Velocity.init()
(シングルトンモデルの使用法)または VelocityEngine.init()
(使用する場合)を呼び出す必要があります。別のインスタンス)、および適切な構成パラメーターを渡します。これらには リソースローダー構成 が含まれます。
テンプレートファイルを配置する場所は、選択したリソースローダーによって異なります。ファイル、クラスパス、jar、URLなどのリソースローダーが利用可能です。
ファイルリソースローダーを使用する場合、テンプレートパスは絶対(ディレクトリ/ファイル)パスである必要があります。ただし、jarリソースローダーでは、絶対パスであってはなりません(テンプレートがjar内にある場合、つまり)。これは、テンプレート内のリンクにも当てはまります。つまり、テンプレートの1つに絶対パスで別のテンプレートが含まれている場合、jarリソースローダーはそれをロードできません。
テンプレートパスを設定するという問題を解決するために、この質問を使用することになりました。 HTMLメールのテンプレートにvelocityを使用しています。
テンプレートパスの設定方法を説明するために使用できるいくつかの方法を次に示します。プロパティ '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", "[email protected]");
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>