2014-04-25 57 views
0

我想使用Velocity生成以下代碼段。帶映射的嵌套foreach無法在Velocity中正常工作


Map<String, List<String>> fruitsAndTypesMap = new HashMap<String, List<String>>(); 
    String fruit_Apple = "Apple"; 
    List<String> types_Apple = new ArrayList<String>(); 
     types_Apple.add("KA"); 
     types_Apple.add("WA"); 
    fruitsAndTypesMap.put(fruit_Apple, types_Apple);  

    String fruit_Orange = "Orange"; 
    List<String> types_Orange = new ArrayList<String>(); 
     types_Orange.add("HO"); 
     types_Orange.add("LO"); 
    fruitsAndTypesMap.put(fruit_Orange, types_Orange); 

我template_fruits.vm文件如下。


#if ($fruitsMap.size()>0) 
    Map<String, List<String>> fruitsAndTypesMap = new HashMap<String,List<String>>(); 
    #foreach($fruitName in $fruitsMap.keySet()) 
     String fruit_$fruitName = "$fruitName"; 
     List<String> types_$fruitName = new ArrayList<String>(); 
      #foreach($fruitType in $fruitsMap.get($fruitName)) 
        types_$fruitName.add("$fruitType.name"); 
      #end 
     fruitsAndTypesMap.put(fruit_$fruitName, types_$fruitName); 
    #end 
#end  

問題的發言:types_ $ fruitName.add( 「$ fruitType.name」); 它不正確地評估$ fruitName。 但是,如果我修改語句爲:類型_($ fruitName).add(「$ fruitType.name」),它會被正確計算,但該值用括號括起來。我不明白括號的評價技巧。

下面的代碼可以用來加載相關的模板執行$ fruitsMap


 public static Map<String, List<Fruit>> getFruitsMap(){ 

    Map<String, List<Fruit>> fruitsMap = new HashMap<String, List<Fruit>>(); 
    List<Fruit> applesList = new ArrayList<Fruit>(); 
    Fruit fruit_Apple = null; 
     fruit_Apple = new Fruit(); fruit_Apple.setName("KA"); 
    applesList.add(fruit_Apple); 
     fruit_Apple = new Fruit(); fruit_Apple.setName("WA"); 
    applesList.add(fruit_Apple); 

    List<Fruit> orangesList = new ArrayList<Fruit>(); 
    Fruit fuit_Orange = null; 
     fuit_Orange = new Fruit(); fuit_Orange.setName("HO"); 
    orangesList.add(fuit_Orange); 
     fuit_Orange = new Fruit(); fuit_Orange.setName("LO"); 
    orangesList.add(fuit_Orange); 

    fruitsMap.put("Apple", applesList); 
    fruitsMap.put("Orange", orangesList); 
    return fruitsMap; 
} 

代碼:


VelocityEngine velEngine = new VelocityEngine(); 
     velEngine.init(); 
    Template template = velEngine.getTemplate("template_fruits.vm"); 
    VelocityContext context = new VelocityContext(); 
     context.put("fruitsMap", FruitClient.getFruitsMap()); 
    StringWriter writer = new StringWriter(); 
     template.merge(context, writer); 
    System.out.println("Content: " + writer.toString());  

語句錯誤的提示 - > types_ $ fruitName.add(「$ fruitType.name」);將會有所幫助。

感謝

回答

1

的說法應該是:

types_${fruitName}.add("$fruitType.name"); 

否則,速度試圖調用$ fruitName對象上的add方法。

+0

+1 for .add澄清。 – Gana

相關問題