[java] 해시 맵 키를 반복하는 Freemarker

Freemarker에는 두 가지 컬렉션 데이터 유형, 목록 및 해시 맵이 있습니다. 목록과 마찬가지로 해시 맵 키를 반복하는 방법이 있습니까?

따라서 데이터가있는 var가 있으면 다음과 같이 말할 수 있습니다.

user : {
  name : "user"
  email : "looser@everything.com"
  homepage : "http://nosuchpage.org"
}

모든 사용자의 속성을 해당 값과 함께 인쇄하고 싶습니다. 이것은 유효하지 않지만 목표는 분명합니다.

<#list user.props() as prop>
  ${prop} = ${user.get(prop)}
</#list>



답변

편집 : FreeMarker 2.3.25 이상에서는이 솔루션을 사용하지 마십시오 .get(prop). 특히 . 다른 답변을 참조하십시오.

내장 기능 을 사용 합니다. 예를 들어 다음과 같이 작동합니다.

<#list user?keys 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)같은 템플릿 언어 구조를 사용하는 등, 그리고 ?keysuser[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