Ссылка на карту по имени в шаблоне Velocity

Почти уверен, что на это есть простой ответ, но просто не могу найти правильный синтаксис 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  

person Wiretap    schedule 26.02.2010    source источник
comment
Почему $msgData.get($inner_map) против $msgData.get("inner_map")?   -  person Snekse    schedule 27.09.2013


Ответы (2)


Пытаться

${in_map.get("data_1")}

or

${in_map.get("a_date")}
person Drew    schedule 26.02.2010
comment
Почему запись через точку не работает? Согласно документам: Так, например, вы можете получить доступ к первому элементу выше, используя $monkey.Map.get(bannana), чтобы вернуть строку «хорошо», или даже $monkey.Map.banana, чтобы вернуть то же значение. - person Snekse; 27.09.2013

Приведенный ответ не сработал для меня, но заставил меня задуматься о проблеме по-другому. Я решил это, создав метод, который может искать подразделы данных на основе строки и возвращает список карт.

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

Это работает даже в том случае, если ваши базовые данные представляют собой XML-документ, поскольку вы можете передать xPath, и метод вернет карту значений тегов tagName. Это обеспечивает большую гибкость.

#set( $data = $confirmData.getCollection("//Message/header[sendFrom='xxx']").get(0) )
person Wiretap    schedule 13.03.2010
comment
не могли бы вы сказать мне, что такое getCollection и get(0)? Где это будет? - person mohammed sameen; 14.05.2016