2013-06-07 6 views
5

私のVelocityテンプレート(.vmファイル)で、VelocityContextにあるすべての変数または属性をループする方法はありますか?以下のコードを参照して、私はテンプレートに文脈で渡されるすべての果物の名前と数を書きたいと思います。VelocityContextのすべての変数をループする方法は?

Map<String, Object> attribues = ...; 
attribues.put("apple", "5"); 
attribues.put("banana", "2"); 
attribues.put("orange", "3"); 

VelocityContext velocityContext = new VelocityContext(attribues); 
velocityEngine.mergeTemplate(templateLocation, encoding, velocityContext, writer); 

答えて

4

。しかし、コンテキスト自体をコンテキストに入れることができます。

のJava:

attributes.put("vcontext", attributes); 

.vm:また、マップを変更するコードを実行しながら、あなたはライブのコンテキストを読んでいるので

#foreach ($entry in $vcontext.entrySet()) 
    $entry.key => $entry.value 
#end 

、あなたが例外を取得するつもりです。地図のコピーを作成することをお勧めします。

#set ($vcontextCopy = {}) 
$!vcontextCopy.putAll($vcontext) 
#foreach ($entry in $vcontextCopy.entrySet()) 
    ## Prevent infinite recursion, don't print the whole context again 
    #if ($entry.key != 'vcontext' && $entry.key != 'vcontextCopy') 
    $entry.key => $entry.value 
    #end 
#end 
+0

ありがとうございます。私はこれが直接可能ではないという確認を求めていました。しかし、あなたのコードVelocityの 'Foreach.render'メソッドを実行すると、' ConcurrentModificationException'がスローされます。これはあなたのために機能しましたか?私はVelocity 1.7を使用しています。 – Somu

+0

私の例のように、結果を印刷する以外に何かしていますか? 1つの可能性は、 '$ entry'変数がエントリを取得した後にコンテキストに追加され、本当に' ConcurrentModificationException'をトリガすることです。簡単な回避策の1つは 'attributes'変数に単純な' HashMap'の代わりに 'ConcurrentHashMap'を使うことです。 –

+0

いいえ、私は単純なループと印刷の他に何もしていません。興味深いことに 'ConcurrentHashMap'を使うと' StackOverflowError'がスローされます!テンプレートからコンテキストに直接アクセスする方法がないことを確認するために、私はあなたの答えを受け入れます。 – Somu

2

方法 VelocityContextに存在するすべての変数または属性によるIループできますか?

あなたが誤解していない場合は、オブジェクトを作成したマップに含まれているキー/値ペアをループする方法を知りたいですか?

もしそうなら、internalGetKeys()メソッドを呼び出すと、VelocityContextオブジェクトに含まれるキーの配列が返されます。

次に、すべてのキーをループし、internalGet()を使用して、各キーに関連付けられた値を取得します。

それはこのようなものになるだろう:あなたはコンテキストオブジェクトを手に入れることができないので、あなたがそれを行うことはできませんデフォルトでは

 VelocityContext velocityContext = new VelocityContext(attribues); 
     Object[] keys = velocityContext.internalGetKeys(); 

     for(Object o : keys){ 
      String key = (String)o; 
      String value = (String)velocityContext.internalGet(key); 
      System.out.println(key+" "+value); 
     } 
+0

ありがとうございました。あなたの問題を正しく理解したと思います。 .vmテンプレートファイルから 'internalGetKeys()'と 'internalGet()'を呼び出す方法を教えてください。私は '#foreach(internalGetKeys()内の$ key)$ key#end'で欠落しているリンクを探しています – Somu

+0

@Somu私の編集をチェックして、助けてくれることを願っています。 –

+0

もう一度ありがとうございます。しかし、私はVelocityテンプレート(.vmファイル)からこれらのメソッドを呼び出す方法を探していました。 – Somu

関連する問題