Thymeleafページに渡されるHashmap (String, List<Offers>)
があります。このマップをページで取得しており、アクセスできます。
Thymeleafでmap.get(key)
を実行するにはどうすればよいですか?特定のキーに基づいて値を取得し、その値を解析して出力するだけです。
Broadleafアプリケーションを実行しており、ThymeleafがそのUIエンジンです。
単に${map.get('key')}
を使用できます
${map.get(key)}
(key
は変数)を使用するとうまくいきます。
${map['key']}
は文字列リテラルキーに対してのみ機能するようです-探しているkey
が変数の場合、${map[key]}
しません動作しているようです。
HashMapでアイテムを検索する完全な例を次に示しますmap
与えられたlistOfKeys
マップから取得したい要素のキーの順序付きリスト。このように別のlistOfKeys
を使用すると、反復の順序を制御でき、オプションでマップから要素のサブセットのみを返します。
<ul>
<li th:each="key: ${listOfKeys}"">
<span th:text="${key}"></span> = <span th:text="${map.get(key)}"></span>
</li>
</ul>
キーの順序付きリストがなく、マップ内のeveryアイテムをループするだけの場合、マップのkeySet()
を直接ループできます(ただし、マップがHashMap
である場合に返されるキーの順序の制御はありません:
<ul>
<li th:each="key: ${map.keySet()}">
<span th:text="${key}"></span> = <span th:text="${map.get(key)}"></span>
</li>
</ul>
この使用法は、マップのentrySet
を繰り返し処理し、返された各エントリのkey
およびvalue
メンバーにアクセスするだけで、さらに簡潔に表現できます。
<ul>
<li th:each="entry: ${map}">
<span th:text="${entry.key}"></span> = <span th:text="${entry.value}"></span>
</li>
</ul>
値にアクセスする方法:
${map[__${key}__]}
キー変数の前処理を行うには、二重アンダースコアの間にキーを配置する必要があります。
私の状況では、HashMap<String, String>
、私はこのようなルックアップをしなければならなかった
<strong th:text="${map['__${entry.key}__']}"></strong>
たとえば、マップ上のキーをループするために、次のドロップダウンボックスを使用しています
<select id="testId">
<option th:each="item: ${itemsMap}"
th:value="${item['key']}"
th:text="${item['value']}" />
</select>
特定の値を取得する場合、私は使用しています
${itemsMap.get('key')}
モデルにマップkeyaccess
があると仮定して、特定のキーmymap
のマップ値にアクセスする方法:
${mymap['keyaccess']}
これにより、エントリに関連付けられたリストが得られますが、今ではそれを繰り返すことができます。
必要に応じて、 documentation から、サポートされている他の反復可能なオブジェクトを反復するのと同じ方法でマップを反復できます。
Thymeleafでの反復に使用できるのは、Java.util.Listオブジェクトだけではありません。実際、th:each属性によって反復可能と見なされるオブジェクトの非常に完全なセットがあります。
- Java.util.Iterableを実装するオブジェクト
- Java.util.Mapを実装するオブジェクト。マップを反復処理する場合、iter変数はJava.util.Map.Entryクラスになります。
- 任意の配列
- 他のオブジェクトは、オブジェクト自体を含む単一値のリストであるかのように扱われます。
remarksMapはTreeMapで、「id」はLong型の値です
<div th:if="${#maps.containsKey(remarksMap, id)}">
<textarea th:text="${remarksMap.get(id)}" rows="2" cols="30" maxlength="250"
autocomplete="off"></textarea>
</div>