2015-10-31 5 views
0
public class Main { 
    public static void main(String[] args) throws IOException, TemplateException{ 
     Configuration freemarkerConfig = new Configuration(); 
     freemarkerConfig.setClassForTemplateLoading(Main.class, ""); 
     Template template = freemarkerConfig.getTemplate("template.ftl"); 

     Map<String, String> data = new HashMap<String, String>(); 

     for(int i=1;i<=10;i++){ 
      data.put("map_"+i, "value"+i); 
     } 
     Writer out = new StringWriter(); 
     template.process(data, out); 
     System.out.println(out.toString()); 
    } 
} 

Вот мой FTL код доступа к переменной:FreeMarker получить значение переменной с помощью конкатенации другой переменной значение

<#assign containerIndex=1> 
${map_containerIndex} 
This gives error 
I want to evaluate ${map_1} 

ответ

0

Вы можете прочитать переменные с такими именами, во время выполнения генерируется как .vars['map_' + i]. Это тот же трюк, который Том использовал в своем ответе, но подал заявку на чтение переменной верхнего уровня.

+0

Позволяет сказать, что мой тип возврата - это объект '.vars ['map_' + i] .name' будет работать, используя этот метод. –

+0

Я не понимаю ваш вопрос, но в любом случае' .vars [...] 'is просто выражение, которое дает вам значение любого типа. В этом нет ничего особенного. – ddekany

0

Вместо того, чтобы пытаться создать переменную (я не думаю, что это возможно, что путь) Я предлагаю предоставить массив шаблону.

Подобно

String[] stringArray = new String[11]; 
for (int i = 1; i<= 10; i++) { 
    stringArray[i] = "value"+i; 
} 
data.put("map", stringArray); 

Доступ в Freemarker должен выглядеть

<#assign containerIndex=1> 
${map[containerIndex]} 

или что-то подобное, не может попробовать его атм

Также отметим, что с помощью запуска для -loop с 1 (как в вашем примере) первый слот массива не будет использоваться.

Я предлагаю

String[] stringArray = new String[10]; 
for (int i = 0; i < 10; i++) { 
    stringArray[i] = "value"+i; 
}