top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Apache FreeMarker で Java 処理を伴うカスタムタグのシンプルサンプルを作成しました。これをメモします。
基本的に 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
に、カスタムディレクティブモデルを追加します。これにより、カスタム処理が有効になります。
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));
}
}
以下のように Maven の mvn
コマンドから実行できます。
mvn install exec:java