2012-04-14 4 views
4

키 값 쌍을 org.w3c.dom.Element : java.util.ArrayList 형태로 저장하는 Java Hashmap 객체가 있습니다. HashMap을 채운 후에는 org.w3c.dom.Element List와 함께 Freemarker 컨텍스트에 넣었습니다. HashMap에서 List 객체를 검색하고 자유 마커 템플릿에서 반복하는 방법은 무엇입니까?

내가 코드 아래 사용하여 목록 개체를 얻을려고

그것은 ${fh[key]}이 정의되지 말한다

<#list ElementList as key> 
<#assign fh =ElemmentListMap> 
    ${fh[key]} 
</#list> 

니펫을. 솔루션을 얻는 방법을 알려 주시거나 다른 솔루션을 제공해주십시오.

답변

-1

${fh.get(key)}

+0

이 할 일 일하지 않아. 그것은'freemarker.core.InvalidReferenceException'을주었습니다. –

+0

대부분의 FreeMarker 설정에서는 작동하지 않습니다. 그것은 (object_wrapper 설정에 따라) 일부에서는 작동하지만, 그런 설정을 사용하는 것은 나쁜 생각입니다. 'fh? api.get (key)'는 더 깨끗한 해결책이지만이 답변에서 더 많이 볼 수 있습니다 : http://stackoverflow.com/a/28794648/606679 – ddekany

4

업데이트처럼를 참조하십시오 :은 2.3.22부터 시작, 당신은 단지 주위에이 일을 ?api를 사용해야합니다. 자세한 내용은 this answer 또는 this FAQ entry을 참조하십시오.

오래된 답 :

여기에 문제의 뿌리는 프리 마커 템플릿 언어 자바의 Map 유형의 해당이없는 것입니다. 대신 "hash"라는 유형이 있습니다. 이는 Map과 유사하지만 문자열 키 (원래 변수 이름) 만 지원합니다. 따라서 fh[key]이 표시되면 key에 문자열 값이있는 것으로 가정합니다 (이 경우 POJO-s의 줄 바꿈으로 인해 key.toString()의 결과가 됨) 따라서 항목을 찾지 못합니다. 따라서 솔루션은 비 문자열 키에 [] 연산자를 사용하지 않고 Java API 인 Map.get(Object key)을 사용합니다.

그리고 나머지는 오래된 ...

하지만 그렇게하려고하면 당신은 또 다른 장애물로 실행됩니다 : 기본 ObjectWrapper는 문자열 키 때문에 Map -s의 방법을 노출하지 않습니다 의 Map 이미 동일한 이름 공간을 채 웁니다. 너무 여러 가지 다른 이유로 기본 ObjectWrapper 싫어, 그래서 나는 항상 이런 식으로 프리 마커를 설정 :

BeansWrapper wrapper = new BeansWrapper(); 
wrapper.setSimpleMapWrapper(true); 
cfg.setObjectWrapper(wrapper); 

당신이 myMap[someStringKey]이나 myMap(whateverKey) 등 모두 Map -s를 사용할 수있는이 래퍼로. 따라서 귀하의 경우에는 ${fh(key)}이됩니다. 다시 말하지만, 기본값 인 ObjectWrapper에서는 작동하지 않습니다.

상황을 악화 시키려면 여기에 W3C DOM을 사용하는 것이 좋습니다. 위의 래퍼는 FreeMarker XML 기능을 사용할 수 있도록 자동으로 Node -s를 포장하지 않습니다. 따라서 필요한 경우 DOM 노드를 수동으로 줄이지 않으면 DOM 노드를 인식하도록 BeansWrapper을 확장해야합니다. 즉 운이 좋게 할 간단합니다 : 당신은 이미 프리 마커를 사용하는 환경이 사용자 정의 ObjectWrapper이있는 경우

public class MyObjectWrapper extends freemarker.ext.beans.BeansWrapper { 

    public TemplateModel wrap(Object obj) throws TemplateModelException { 
     if (obj instanceof org.w3c.dom.Node) { 
      return freemarker.ext.dom.NodeModel.wrap((org.w3c.dom.Node) obj); 
     } else { 
      return super.wrap(obj); 
     } 
    } 

} 

마지막 것은 고려. 그런 경우에, 당신은 그걸 어떻게 든 확장하려고 더 잘 ...

0

귀하의 자바 코드은 다음과 같아야합니다

Map map = new HashMap(); 
List list = new ArrayList(); 
list.add("red"); 
list.add("green"); 
list.add("blue"); 
map.put("array_list", list); 

그리고이 프리 마커 템플릿가 있어야한다 :

<#list array_list as i> 
    ${i} 
</#list> 

출력 :

red 
green 
blue 
관련 문제