Freemarker를 사용하면서 내가 자주 실수하고 놓치는 부분을 정리했따. 



1. null 체크는 ??로 한다.  '변수 == null ?'

freemarker에서는 null check는 ?? 로 이용하면 된다. 


<#if userList??>

<#list userList as id >

    ${id}

</#list>

</#if>



else if 는 항상 붙여 쓴다.!!   #elseif



2. conditional statement(if 문)에서는 '='은 두번 쓰지 않는다. 하나의 = 만을 쓴다. 

<#if category = "home">

<#elseif category = "content">

</#if>




3. map 의 모든 요소 표현

Map<String, String> (O)

Map<String, Object> (X)


<#list hashMap?keys as it>

   ${it} = ${hashMap[it]}

</#list>

        


이런 표현식의 주의점은 map의 value 값이 String, Date, Number 타입이 아닌 타입이 들어왔을 가능성이 높다. 아니면, Object 여도 안된다. 

예를 들어 Map 안에 key가 "key" 인데, value가 Collection type이나 Object type이면 아래와 같은 에러가 발생할 것이다. 


ERROR ~ Template processing error: "Error on line 37, column 29 in searchengine.ftl\nExpecting a string, date or number here, Expression hashMap[it] is instead a freemarker.template.TemplateBooleanModel$2"


자세한 내용은 아래 내용을 참조한다. 
http://fmpp.sourceforge.net/freemarker/app_faq.html#faq_question_14



4. List of map 표현

List<Map<String, Object>> userList 



<#if userList??>

<#list userList as user>

    ${user.content}

    ${user.link}

</#list>

</#if>



또는 (역순 출력, 응근히 많이 쓰임)

<#if userList??>

<#list userList?reverse as user>

    ${user.content}

    ${user.link}

</#list>

</#if>


#list 에서 {$user.content}를 사용하고 있지만 if/elseif 문에서는 무장해제를 변수를 시켜야 한다.


// 잘못된 표현

<#if ${user. content} == 'abc'> abc </#if>    


// 좋은 표현

<#if user. content == 'abc'> abc </#if>    



5. List 표현

List<String> userList  

<#if userList??>

<#list userList as activityId >

   ${activityId}

</#list>

</#if>



더 좋은 정보 

http://viralpatel.net/blogs/iterate-hashmap-in-freemarker-ftl/




6. 숫자 관련

high chart 연동하면서 실수한 부분인데..

freemarker는 디폴트로 1000 이상의 숫자는 ,(comma)를 사용한다. 따라서 json의 배열 요소를 나누는 , 와 1,000의 , 가 동시에 사용될 수 있는 단점이 있다.

이를 위해서는 아래와 같이 하면 1,000 대신 1000 이라는 숫자만 출력한다.

${x?c} 


참고로, 아래 내용을 참고한다.







<#assign x = 1000>

${x}                 <#-- 1,000 -->

${x?string}          <#-- 1,000 -->

${x?c}               <#-- 1000 -->

${x?string.computer} <#-- 1000 -->


http://stuartgunter.wordpress.com/2011/09/01/freemarker-default-number-formatting/




7 </#if> 실수


<#if actionTagGuide.objectType != "mp4">11111

<#else>aaa

<#/if>

이것은 컴파일되지 않는다.  #와 /를 거꾸로 쓸 때가 있어서 /이 먼저 그 다음이 #이 와야 한다.



<#if item.objectType != "mp4">11111

<#else>aaa

</#if>





Posted by 김용환 '김용환'

댓글을 달아 주세요

  1. Favicon of https://junho85.pe.kr BlogIcon 준호씨 2021.06.28 17:17 신고  댓글주소  수정/삭제  댓글쓰기

    2. conditional statement(if 문)에서는 '='은 두번 쓰지 않는다. 하나의 = 만을 쓴다.
    -> 여기서 == 처럼 두번 쓰는게 맞는 거 같습니다.
    https://freemarker.apache.org/docs/ref_directive_if.html
    예제에
    ----
    <#if x == 1>
    x is 1
    </#if>
    ----
    이렇게 나와있네요.
    freemarker 옛 버전 문서도 보고 싶긴 한데 문서를 못 찾겠네요 ^^;