Freemarker에는 두 가지 컬렉션 데이터 유형, 목록 및 해시 맵이 있습니다. 목록과 마찬가지로 해시 맵 키를 반복하는 방법이 있습니까?
따라서 데이터가있는 var가 있으면 다음과 같이 말할 수 있습니다.
user : {
name : "user"
email : "looser@everything.com"
homepage : "http://nosuchpage.org"
}
모든 사용자의 속성을 해당 값과 함께 인쇄하고 싶습니다. 이것은 유효하지 않지만 목표는 분명합니다.
<#list user.props() as prop>
${prop} = ${user.get(prop)}
</#list>
답변
답변
참고로 값을 검색하는 구문이 다음에 따라 변경된 것 같습니다.
http://freemarker.sourceforge.net/docs/ref_builtins_hash.html
<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>
답변
2.3.25부터 다음과 같이하십시오.
<#list user as propName, propValue>
${propName} = ${propValue}
</#list>
이것은 문자열이 아닌 키에서도 작동한다는 점에 유의하십시오 ( 당시 map[key]
로 작성되어야하는, 달리 map?api.get(key)
).
2.3.25 이전의 표준 솔루션은 다음과 같습니다.
<#list user?keys as prop>
${prop} = ${user[prop]}
</#list>
그러나 일부 정말 오래된 FreeMarker 통합은 이상한 구성을 사용하는데, 공개 Map
메서드 (예 getClass
:)가 키로 나타납니다. 속성이 남아 있는 순수 BeansWrapper
(대신 DefaultObjectWrapper
)를 사용하기 때문에 발생 simpleMapWrapper
합니다 false
. 방법을 실제 Map
항목 과 혼합하므로 이러한 설정은 피해야 합니다. 당신이 그런 불행한 설치로 실행한다면, 상황을 탈출 할 수있는 방법은 같은 노출 된 Java 메소드를 사용하고 user.entrySet()
, user.get(key)
같은 템플릿 언어 구조를 사용하는 등, 그리고 ?keys
나 user[key]
.
답변
노출 수준이 Expose.SAFE 또는 Expose.ALL 인 BeansWrapper 를 사용하는 경우 항목 집합을 반복하는 표준 Java 접근 방식을 사용할 수 있습니다.
예를 들어, 다음은 Freemarker에서 작동합니다 (최소 버전 2.3.19부터).
<#list map.entrySet() as entry>
<input type="hidden" name="${entry.key}" value="${entry.value}" />
</#list>
예를 들어 Struts2 에서 BeanWrapper의 확장은 이러한 방식의 반복을 허용하도록 기본 노출 수준으로 사용됩니다.
답변
반복 객체
맵 키가 문자열이 아니라 객체 인 경우 Freemarker를 사용하여 반복 할 수 있습니다.
1) 컨트롤러에서 맵을 목록으로 변환하십시오.
List<Map.Entry<myObjectKey, myObjectValue>> convertedMap = new ArrayList(originalMap.entrySet());
2) Freemarker 템플릿에서 맵을 반복하여 키의 개체와 값의 개체에 액세스합니다.
<#list convertedMap as item>
<#assign myObjectKey = item.getKey()/>
<#assign myObjectValue = item.getValue()/>
[...]
</#list>
답변
완전성을 위해 최근부터 Freemarker에서 빈 컬렉션을 적절하게 처리하고 있음을 언급 할 가치가 있습니다.
따라서지도를 반복하는 가장 편리한 방법은 다음과 같습니다.
<#list tags>
<ul class="posts">
<#items as tagName, tagCount>
<li>{$tagName} (${tagCount})</li>
</#items>
</ul>
<#else>
<p>No tags found.</p>
</#list>
더 이상 <#if ...>
래퍼가 없습니다 .
답변
작은 따옴표를 사용하여 Java 프로그램에서 설정 한 키에 액세스 할 수 있습니다.
이와 같이 Java에서 Map을 설정하면
Map<String,Object> hash = new HashMap<String,Object>();
hash.put("firstname", "a");
hash.put("lastname", "b");
Map<String,Object> map = new HashMap<String,Object>();
map.put("hash", hash);
그러면 다음과 같이 Freemarker에서 ‘hash’의 멤버에 액세스 할 수 있습니다.
${hash['firstname']}
${hash['lastname']}
출력 :
a
b
