2

マップを反復する場合

<#list map?keys as key> ${key} </#list>

clone、1、getKey、5などを返します

不要な値を1つずつ削除する代わりに、誰かが解決策を持っていますか?

4

2 に答える 2

4

私がよく理解していれば、メソッドとキーの両方が混在しています。これは、object_wrapper構成設定 ( Configuration.setObjectWrapper(ObjectWrapper)) によって異なります。BeansWrapperをとして使用している場合object_wrapper(この問題がまったくなかった とは対照的にDefaultObjectWrapper)、これは によって防ぐことができますyourBeansWrapper.setSimpleMapWrapper(true)。ただし、そのプロジェクトでfalse. FreeMarker 言語にはマップ タイプがないという問題があります。ハッシュと呼ばれるものがあり、文字列キー (サブ変数) のみをサポートします。したがって、人々は、 などのハッシュ演算子の代わりに -s の Java API を使用するだけでよく、そのために必要java.util.Mapです。そうしないと、メソッドが表示されません。次に、書く必要があります。[]?keyssetSimpleMapWrapper(false)Mapmap.keySet()

更新: 2.3.22 以降では、Java メソッド (および Java Bean プロパティ) は のように別の名前空間でアクセスできるため、メソッドとキーを混在させて使用することは強制されなくなりました (これは当時でもかなり混乱した回避策でした) ?apimyMap?api.get(nonStringKey)などmyMap?api.keySet()。したがってObjectWrapper、キーのみを公開し、機能Mapをサポートするを使用して?api(できればobject_wrapper=DefaultObjectWrapper(2.3.22))、有効にして?api(api_builtin_enabled=trueデフォルトでは後方セキュリティのために許可されていません)、?apiJava API 名前空間から何かが必要な場合にのみ使用し、それ以外の場合は使用できます。[]?keysなど。MapキーがString-s の場合。

于 2012-10-20T08:00:19.103 に答える
1

以下の構文で試してください

<#assign keys = map?keys>
<#list keys as key>${key} = ${h[key]}; </#list>

リンクを見る

EDIT - @ddekanyの回答を拡張し、

FTLを解析/呼び出すコードでこれを処理する必要があります。以下のようなものです(サンプルコードのみ)。ここに FTL 処理コードを追加できればもっと良かったかもしれません。

 BeansWrapper ow = new BeansWrapper();
  ow.setExposeFields(true);
 // ow.setSimpleMapWrapper(true);

  Template template = freeMarkerConfiguration.getTemplate(templateName, locale);
  template.setObjectWrapper(ow);
  template.process(root, writer);
于 2012-10-20T08:06:57.043 に答える