在Velocity Template中按名称引用Map

时间:2010-02-26 19:43:13

标签: java templates velocity vtl

非常肯定有一个简单的答案,但是找不到合适的VTL语法。

在我的上下文中,我传递的是包含其他地图的地图。我想按名称引用这些内部地图,并在我的模板中分配它们。内部地图由应用程序的不同部分构建,然后添加到上下文

作为例子

public static void main( String[] args )
    throws Exception
{

    VelocityEngine ve = new VelocityEngine();
    ve.init();
    Template t = ve.getTemplate( "test.vm" );
    VelocityContext context = new VelocityContext();

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


    Map<String,String> data_map = new HashMap<String,String>();
    data_map.put("data_1","1234");
    data_map.put("a_date", "31-Dec-2009");

    messageData.put("inner_map", data_map);

    context.put("msgData", messageData);
    StringWriter writer = new StringWriter();

    t.merge( context, writer );
    System.out.println( writer.toString() );
}

模板 - test.vm

#set ($in_map =  $msgData.get($inner_map) )

data:

    $in_map.data_1
    $in_map.a_date  

2 个答案:

答案 0 :(得分:2)

尝试

${in_map.get("data_1")}

${in_map.get("a_date")}

答案 1 :(得分:0)

给出的答案对我不起作用,但确实让我以不同的方式思考问题。我通过创建一个方法来解决这个问题,该方法可以根据字符串查找数据的子部分并返回一个地图列表。

#set( $data = $confirmData.getCollection("MSG_DATA").get(0) )

如果您的基础数据是XML文档,这甚至可以工作,因为您可以传入xPath并让方法返回tagName tagValues的映射。这提供了很大的灵活性。

#set( $data = $confirmData.getCollection("//Message/header[sendFrom='xxx']").get(0) )