Java 如何基于一个Freemarker模板创建多个文件

Java 如何基于一个Freemarker模板创建多个文件,java,code-generation,freemarker,Java,Code Generation,Freemarker,我现在在freemarker上有点麻烦。我想在模板中基本上做的是:迭代元素列表,并为每个元素创建一个新文件 <#assign x=3> <#list 1..x as i> ${i} ...create a new file with the output of this loop iteration... </#list> ${i} …使用此循环迭代的输出创建新文件。。。 我没有在freemarker手册或谷歌上找到任何关于这方面的信息。有办法做到这

我现在在freemarker上有点麻烦。我想在模板中基本上做的是:迭代元素列表,并为每个元素创建一个新文件

<#assign x=3>
<#list 1..x as i>
  ${i}
...create a new file with the output of this loop iteration...
</#list>

${i}
…使用此循环迭代的输出创建新文件。。。

我没有在freemarker手册或谷歌上找到任何关于这方面的信息。有办法做到这一点吗?

您不能只使用FreeMarker。其思想是从模板生成单个输出流。它甚至不关心是否将结果保存到文件、直接传递到TCP套接字、以字符串形式存储在内存中或执行其他操作

如果您真的想实现这一点,您必须自己处理文件分离。例如,可以插入特殊行,如:

<#assign x=3>
<#list 1..x as i>
  ${i}
%%%%File=output${i}.html
...
</#list>

${i}
%%%%File=output${i}.html
...

之后,您应该自己对FreeMarker输出进行后期处理,查找以
%%%File=
开头的行,并在此时创建一个新文件。

您可以使用自定义指令来实现这一点。请参见
freemarker.template.TemplateDirectiveModel
,特别是
TemplateDirectiveBody
。自定义指令可以指定嵌套内容中使用的
编写器
。因此,您可以执行类似于
的操作,其中嵌套的内容将写入在
TemplateDirectiveModel
实现中提供的
编写器
,在这种情况下,它应该写入指定的文件。(FMPP也这样做:)

正如迪卡尼所说,您可以通过执行指令来实现这一点。我编写了一个小示例:

package spikes;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import freemarker.core.Environment;
import freemarker.template.Configuration;
import freemarker.template.SimpleScalar;
import freemarker.template.Template;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

class OutputDirective implements TemplateDirectiveModel {
    
    @Override
    public void execute(
            Environment env, 
            @SuppressWarnings("rawtypes") Map params, 
            TemplateModel[] loopVars, 
            TemplateDirectiveBody body)
            throws TemplateException, IOException {
        
        SimpleScalar file = (SimpleScalar) params.get("file");
        
        FileWriter fw = new FileWriter(new File(file.getAsString()));
        body.render(fw);
        fw.flush();
    }
}

public class FreemarkerTest {   
    
    public static void main(String[] args) throws Exception {
        
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_0);
        cfg.setDefaultEncoding("UTF-8");
        
        JsonObject model = new JsonObject()
                .put("entities", new JsonArray()
                        .add(new JsonObject()
                                .put("name", "Entity1"))
                        .add(new JsonObject()
                                .put("name", "Entity2")));
        
        Template template = new Template("Test", "<#assign model = model?eval_json><#list model.entities as entity><@output file=entity.name + \".txt\">This is ${entity.name} entity\n</@output></#list>", cfg);
        
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("output", new OutputDirective());
        root.put("model", model.encode());
        Writer out = new OutputStreamWriter(System.out);
        template.process(root, out);
    }
}
包装尖峰;
导入java.io.File;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.OutputStreamWriter;
导入java.io.Writer;
导入java.util.HashMap;
导入java.util.Map;
导入freemarker.core.Environment;
导入freemarker.template.Configuration;
导入freemarker.template.SimpleScalar;
导入freemarker.template.template;
导入freemarker.template.TemplateDirectiveBody;
导入freemarker.template.TemplateDirectiveModel;
导入freemarker.template.TemplateException;
导入freemarker.template.TemplateModel;
导入io.vertx.core.json.JsonArray;
导入io.vertx.core.json.JsonObject;
类OutputDirective实现TemplateDirectiveModel{
@凌驾
公开无效执行(
环境署,
@SuppressWarnings(“rawtypes”)映射参数,
TemplateModel[]loopVars,
TemplateDirectiveBody(实体)
抛出TemplateException,IOException{
SimpleScalar文件=(SimpleScalar)params.get(“文件”);
FileWriter fw=newfilewriter(新文件(File.getAsString());
渲染体(fw);
fw.flush();
}
}
公共类FreemarkerTest{
公共静态void main(字符串[]args)引发异常{
Configuration cfg=新配置(Configuration.VERSION\u 2\u 3\u 0);
设置默认编码(“UTF-8”);
JsonObject模型=新的JsonObject()
.put(“实体”,新JsonArray()
.add(新的JsonObject()
.put(“名称”、“实体1”))
.add(新的JsonObject()
.put(“名称”、“实体2”);
模板模板=新模板(“测试”,“这是${entity.name}entity\n”,cfg);
Map root=newhashmap();
root.put(“output”,new OutputDirective());
root.put(“model”,model.encode());
Writer out=新的OutputStreamWriter(System.out);
模板。进程(根,出);
}
}
这将生成两个文件:

“Entity1.txt”:这是Entity1实体

“Entity2.txt”:这是Entity2实体

:-)