top / index / prev / next / target / source

2017-01-06 diary: [FreeMarker] Java 処理を伴うカスタムタグのシンプルメモ

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

[FreeMarker] Java 処理を伴うカスタムタグのシンプルメモ

Apache FreeMarkerJava 処理を伴うカスタムタグのシンプルサンプルを作成しました。これをメモします。

基本的に 2017-01-01 diary: [FreeMarker] シンプルサンプル をベースに以下のクラスを追加および既存クラスを書き換えます。

カスタムなディレクティブモデルのクラス

まず、カスタムなディレクティブモデルのクラスを作成します。

package my.sandbox;

import java.io.BufferedWriter;
import java.io.IOException;
import java.util.Map;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;

public class MyDirectiveModel implements TemplateDirectiveModel {
  public void execute(final Environment env, @SuppressWarnings("rawtypes") final Map params,
      final TemplateModel[] loopVars, final TemplateDirectiveBody body) throws TemplateException, IOException {
    final BufferedWriter writer = new BufferedWriter(env.getOut());
    writer.write("My custom tag. [" + params.get("param1") + "]");
    writer.flush();
  }
}

Configuration の変更

Configuration に、カスタムディレクティブモデルを追加します。これにより、カスタム処理が有効になります。

package my.sandbox;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Map;

import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

public class App {
  public static void main(final String[] args) throws IOException, TemplateException {
    final Configuration config = new Configuration(Configuration.VERSION_2_3_25);
    config.setDefaultEncoding("UTF-8");
    config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
    config.setLogTemplateExceptions(false);

    config.setTemplateLoader(new TemplateLoader() {
      private static final String MY_TEMPLATE_STRING = "First custom directive.\n<@mytag param1=\"MyParam1!\" />.";

      public Object findTemplateSource(String name) throws IOException {
        return "mine";
      }

      public long getLastModified(Object templateSource) {
        return System.currentTimeMillis();
      }

      public Reader getReader(Object templateSource, String encoding) throws IOException {
        return new StringReader(MY_TEMPLATE_STRING);
      }

      public void closeTemplateSource(Object templateSource) throws IOException {
      }
    });

    // register custom tag.
    config.setSharedVariable("mytag", new MyDirectiveModel());

    final Map<String, String> templateData = new HashMap<String, String>();

    final Template templateBase = config.getTemplate("mine");
    templateBase.process(templateData, new OutputStreamWriter(System.out));
  }
}

実行

以下のように Mavenmvn コマンドから実行できます。

mvn install exec:java

関連する日記

登場キーワード


この日記について