Freemarker - как дважды зациклить один и тот же список?

При повторении одного и того же цикла дважды я получил ошибку:

freemarker.template.SimpleSequence нельзя применить к java.util.List

Первый цикл

<#assign peopleMap = context.getpeopleMapByGender()>

<#foreach item in peopleMap["man"] > 
            ${item.first_name!"Unknown"} ${item.last_name!"Unknown"} 
</#foreach>

Второй цикл

<#foreach item1 in peopleMap["man"]> 
            ${item1.address!"Unknown"}    
</#foreach>

Есть ли способ заставить его работать? Что я делаю не так?


person Eran Medan    schedule 16.09.2011    source источник


Ответы (1)


Не уверен, если честно. Этот простой пример работает. Может быть, попробуйте разбить свой шаблон и посмотреть, что произойдет. Я думал, что getpeopleMapByGender() может быть опечаткой с строчными буквами p, но это означало бы, что ни один цикл не будет работать.

example.ftl

<#assign peopleMap = context.getPeopleMapByGender()>

<#foreach item in peopleMap["man"] > 
            ${item.first_name!"Unknown"} ${item.last_name!"Unknown"} 
</#foreach>

<#foreach item1 in peopleMap["man"]> 
            ${item1.address!"Unknown"}    
</#foreach>

Тестовый класс

package grimbo.test.freemarker;

import java.io.File;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;

public class DoubleLoop {
    public static void main(String[] args) throws Exception {
        Configuration cfg = new Configuration();
        cfg.setDirectoryForTemplateLoading(new File("./src/test/freemarker"));
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        Template temp = cfg.getTemplate("example.ftl");
        Map root = new HashMap();
        root.put("context", new Context());
        Writer out = new OutputStreamWriter(System.out);
        temp.process(root, out);
        out.flush();
    }

    public static class Context {
        public Map getPeopleMapByGender() {
            Map m = new HashMap();
            m.put("man", Arrays.asList(new Man[] { new Man(), new Man(), new Man() }));
            return m;
        }
    }

    public static class Man {
        private String first_name = "first";

        public String getFirst_name() {
            return first_name;
        }

        public void setFirst_name(String first_name) {
            this.first_name = first_name;
        }
    }
}

Вывод

        first Unknown 
        first Unknown 
        first Unknown 

        Unknown    
        Unknown    
        Unknown    
person Paul Grime    schedule 16.09.2011