freemarker自學1.0

1.引入bootstrap4的css樣式

<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1
/css/bootstrap.css" rel="stylesheet">

2.list

<#assign thingsList = sqlt.sqlQueryForList("todo_list.getList")>
<#list thingsList as l>
    <div>${l.tid}--${l.type}--${l.content}</div>
</#list>

在這裏插入圖片描述


宏是在模板中使用macro指令定義

宏是和某個變量關聯的模板片斷,以便在模板中通過用戶定義指令使用該變量,

調用宏時,與使用FreeMarker的其他指令類似,只是使用@替代FTL標記中的#

1.macro定義模板,然後調用直接顯示

<#macro greet>
    <font size = "+2">Hello Alice!</font>
    <span class="text-primary">aliceRachel</span>
</#macro>
<@greet></@greet>
<@greet/>

在這裏插入圖片描述

2.在macro指令中可以在宏變量之後定義參數

<#macro greet person>
    <font size = "+2" class="text-danger">Hi~ ${person}</font>   
</#macro>
<@greet person="Prime"></@greet>
<@greet person="kamma"/>

在這裏插入圖片描述

3.macro 定義多個參數

<#macro greet1 person1 color="green">
    <font size = "+2" color="${color}">This is a good day! ${person1}===</font>
    
</#macro>
<@greet1 person1="Fred"></@greet1>
<@greet1 person1="Batman"/>

在這裏插入圖片描述

4.自定義指令嵌套內容 #nested>

macro可以有多個參數,參數的次序是無關的, 在macro指令中只能使用定義的參數,並且必須對所有參數賦值, 可以在定義參數時指定缺省值

<#macro border>
    <table border=4 cellspacing=0 cellpadding =4>
        <tr>
            <td>
                <#nested>
                 <#nested>
            </td>
             <td>
                <#nested>
            </td>
        </tr>
    
    </table>
</#macro>
<@border>The bordered text</@border>

在這裏插入圖片描述

ps:#nested>就相當於佔位符,#nested>指令可以被多次調用

<#macro do_thrice>
    <#nested>
    <#nested>
    <#nested>
</#macro>
<@do_thrice>Beautiful</@do_thrice>

在這裏插入圖片描述

5.局部變量對嵌套內容不可見

<#macro repeat count> 
    <#local y = "test"> 
    <#list 1..count as x> 
      ${y} ${count}/${x}: <#nested> 
    </#list> 
</#macro> 

<@repeat count=3>${y?default("?")} ${x?default("?")} 
${count?default("?")}</@repeat> 

在這裏插入圖片描述

6.宏定義中使用循環變量

nested指令也可以有循環變量(循環變量的含義見下節),調用宏的時候在宏指令的參數後面,分號隔開依次列出循環變量的名字,格式如下:

尖括號@ macro_name paramter list; loop variable list[,]尖括號

<#macro repeat count> 
    <#list 1..count as x> 
      <#nested x, x/2, x==count> 
    </#list> 
</#macro> 

<@repeat count=4 ; c, halfc, last> 
    ${c}. ${halfc}<#if last> Last!</#if> 
</@repeat> 

在這裏插入圖片描述



java Freemarker中macro可以用於實現自定義指令, 通過使用自定義指令, 可以將一段模板片段定義成一個用戶指令

name:指定的是該自定義指令的名字, 使用自定義指令時可以傳入多個參數。 宏變量的名稱,它不是表達式。和 頂層變量 的語法相同,比如 myMacro 或 my\-macro

paramX:指定使用自定義指令時報參數, 使用該自定義指令時,必須爲這些參數傳入值 ( 局部變量 的名稱,存儲參數的值 (不是表達式),在 = 號後面和默認值(是表達式)是可選的。 默認值也可以是另外一個參數,比如 <#macro section title label=title>。參數名稱和 頂層變量 的語法相同,所以有相同的特性和限制)

nested:輸出使用自定義指令時的中間部分

nested指令中的循環變量:這此循環變量將由macro定義部分指定 ,傳給使用標籤的模板

return:可用於隨時結束該自定義指令

基本格式:
<#macro name param1 param2 ... paramN>
  ...
  <#nested loopvar1, loopvar2, ..., loopvarN>
  ...
  <#return>
  ...
</#macro>
return 和 nested 指令是可選的,而且可以在 <#macro ...> 和 </#macro> 
之間被用在任意位置和任意次數。

1. macro簡單例子

<#macro test foo bar ="Bar" baaz=-1>
    Test and params: ${foo}, ${bar}, ${baaz}
</#macro>
<@test foo="a" bar="b" baaz=5*5-2 />
<#--  Test and params: a, b, 23  -->
<@test foo="a" bar="b"  />
<#--  Test and params: a, b, -1   -->
<@test foo="a"  baaz=5*5-2 />
<#--  Test and params: a, Bar, 23  -->
<@test foo="a" />
<#--  Test and params: a, Bar, -1  -->

2. macro自定義循環輸出的宏

<#macro list title items>
    <p>${title?cap_first}</p>
    <p>${title?capitalize}</p>
    <ul>
        <#list items as x>
            <li>${x?cap_first}</li>
        </#list>
    </ul>
</#macro>
<@list items=["mouse","elephant","python"] title="animals" />

在這裏插入圖片描述

3. macro結合參數使用

<div>
    <#macro test>
        <font color="blue">沒有參數的macro</font>
    </#macro>
    <@test />
</div>
<div>
    <#macro test1 params1 params2>
        <font color="red">
        有參數的macro,params1=${params1},params2=${params2}</font>

    </#macro>
    <@test1 params1="java" params2="freemarker"/>
</div>
<div>
    <#macro test2 params1 params2="python">
        <font color="grey">
        	有參數默認值的macro,params1=${params1},params2=${params2}
        </font>
    </#macro>
    <br>
    <@test2 params1="alice" params2="prime" />
    <br>
    <@test2 params1="alice" />
</div>
<div>
    <#macro test3 params1 params2="python" paramExt...>
        <font color="green">
        	有多個參數的macro,params1=${params1},params2=${params2}
        </font>
        <br>
        <font color="blue">${paramExt['params3']}</font>
    </#macro>
    <@test3 params1="alice" params2="prime" 
    params3="javascript" params4="element"/>
</div>

在這裏插入圖片描述

4.宏嵌套nested 的使用

<#-- 嵌套宏 -->
<#macro border>
  <table border="1">
    <#nested>
        <#nested>
        <#nested>
  </table>
</#macro>

<#-- 嵌套宏使用 -->
<@border>
  <tr><td>hahaha</td></tr>
</@border> 

在這裏插入圖片描述

<#-- 嵌套宏 -->
<#macro border>
  <table border="1">
    <#nested>
        <#nested>
        <#nested>
  </table>
</#macro>

<#-- 嵌套宏使用 -->
<@border>
  <tr>
        <td>中國</td>
        <td>遼寧省</td>
        <td>大連市</td>
    </tr>
</@border>

在這裏插入圖片描述

<#-- 循環嵌套宏 -->
<#macro repeat count>
  <#list 1..count as x>
    <#-- 使用nested指令時指定了三個循環變量  -->
    <#nested x, x/2, x==count> 
  </#list>
</#macro>

<#-- 使用宏 -->
<@repeat count = 4; c, halfc, last>
  ${c}. ${halfc}<#if last> Last!</#if>
</@repeat>

在這裏插入圖片描述

5. macro定義輸出html的自定義指令

macro_copy.ftl 中內容爲(以下):

<#--  common.ftl 將一個HTML頁面模板定義成一個page指令,則可以在其他頁面中如此page指令  -->
<#macro page title>
<html>
<head>
   <title>FreeMarker示例頁面 - ${title}</title>
</head>
<body>
   <h1>${title}</h1>
   <#nested>
    <#--  //用於引入用戶自定義指令的標籤體  -->
</body>
</html>
</#macro>

在本文件中進行引入:

<#--  引用自定義的page指令  -->
<#--  對應macro_copy.ftl使用  -->
<#import "macro_copy.ftl" as com>
<#-- macro定義輸出html的自定義指令  -->
<#--  引用自定義的page指令  -->
<#--  對應macro_copy.ftl使用  -->
<#import "macro_copy.ftl" as com>
<@com.page title="book list">
<u1>
<li>spring</li>
<li>j2ee</li>
</ul>
</@com.page>
<p>
    1. macro是和某個變量關聯的模板片斷,
    以便在模板中通過用戶定義指令使用該變量。
</p>
<p>
   2. 在macro進行自定義指令中可以在宏變量之後定義參數,
   調用宏時,與使用FreeMarker的其他指令類似,
   只是使用@替代FTL標記中的#。
</p>

在這裏插入圖片描述
在這裏插入圖片描述

5、nested指令

1)nested指令 是可選的,可以在#macro>

<#macro tag>  
    <#nested/>  
</#macro>  
<@tag>  
    <ul>  
        <li>1</li>  
        <li>2</li>  
        <li>3</li>  
        <li>4</li>  
        <li>5</li>  
    </ul>  
</@tag>  

在這裏插入圖片描述

function, return

構建函數,求平均值

<#function avg nums...>   
  <#local sum = 0>   
  <#list nums as num>   
    <#local sum = sum + num>   
  </#list>   
  <#if nums?size != 0>   
    <#return sum / nums?size>   
  </#if>   
</#function>   
<#--  15  -->
<span style="color:green;font-size:2rem">${avg(10, 20)}</span>   
<#--  25  -->
<span style="color:blue;font-size:2rem">${avg(10, 20, 30, 40)} </span>  
<#--  N/A    -->
<span style="color:pink;font-size:2rem">${avg()!"N/A"}  </span>   

在這裏插入圖片描述

自定義指令--嵌套的內容

<#macro border>
  <table border=4 cellspacing=0 cellpadding=4><tr><td>
    <#nested>
  </tr></td></table>
</#macro>
<#macro greet person color="pink">
  <font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
<#macro do_thrice>
  <#nested>
  <#nested>
  <#nested>
</#macro>

<@border>
  <ul>
  <@do_thrice>
    <li><@greet person="Joe"/>
  </@do_thrice>
  </ul>
</@border>

在這裏插入圖片描述

因爲 y, x 和 count 是宏的局部(私有)變量,從宏外部定義是不可見的。 此外不同的局部變量的設置是爲每個宏自己調用的,所以不會導致混亂

<#macro repeat count>
  <#local y = "test">
  <#list 1..count as x>
    ${y} ${count}/${x}: <#nested>
    <br>
  </#list>
</#macro>
<@repeat count=3>${y!"?"} ${x!"?"} ${count!"?"}</@repeat>

在這裏插入圖片描述

<#macro test foo>${foo} (<#nested>) ${foo}</#macro>
<@test foo="A"><@test foo="B"><@test foo="C"/></@test></@test>

在這裏插入圖片描述

宏和循環變量

<#macro do_thrice>
  <#nested 1>
  <#nested 2>
  <#nested 3>
</#macro>
<@do_thrice ; x> <#-- user-defined directive uses ";" instead of "as" -->
  ${x} Anything.
</@do_thrice>

在這裏插入圖片描述

指令-字母全部大寫

<#list ["red", "green", "blue"] as color>
    ${color?upper_case}
  </#list>

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章