2

これに対する簡単な答えがあることは確かですが、正しい 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  
4

2 に答える 2

2

試す

${in_map.get("data_1")}

また

${in_map.get("a_date")}
于 2010-02-26T20:56:21.653 に答える
0

与えられた答えは私にはうまくいきませんでしたが、問題について別の方法で考えるようになりました。文字列に基づいてデータのサブセクションを検索し、マップのリストを返すメソッドを作成することで、これを解決しました。

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

これは、xPath を渡してメソッドに tagName tagValues のマップを返させることができるため、基になるデータが XML ドキュメントの場合でも機能します。これにより、多くの柔軟性が提供されます。

#set( $data = $confirmData.getCollection("//Message/header[sendFrom='xxx']").get(0) )
于 2010-03-13T16:21:50.557 に答える