freemarker自学2.0

部分内容连接数据库

<#assign list = sqlt.sqlQueryForList("todo_list.getList")>

在sql文件夹下创建todo_list.sql文件,书写sql语句

-- [getList] 获取列表信息
 select * from "list" ORDER BY seq

在这里插入图片描述
在这里插入图片描述

1.list = sqlt.sqlQueryForList("todo_list.getList")封装好的获取列表信息

2.#if>指令

3.#list>指令

4.#include>指令可以引入其他文件` 形式如:#include "/bb.ftl">`

5.内联函数—l.content?length-2.?upper_case转换为大写- {fruit}:对应下标{fruit_index}

内联函数学习:内联函数官网地址

	<#assign list = sqlt.sqlQueryForList("todo_list.getList")>
	<#list list as l> 
    <p>获取list大小size这里的应该是字段个数 ${l?size}</p>
    <p>list遍历中的下标序号: _index是list的一个属性 ${l_index} </p>
    <div>${l.tid}===${l.build_date}===${l.content}===

    <#if l.status==0>
        已完成
        <#elseif l.status==1>
        未完成
    </#if>

   ${l.status}===${l.type}
    </div>
    <div>求字符串长度: ${l.content?length}   <br/></div>
    </#list> 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

freemarker 标签循环list 以及获取下标值

<#list ["apple","banana","orange"] as fruit>
	${fruit}    :   对应下标${fruit_index}
    <br>
</#list>

在这里插入图片描述

6.表达式插值 #assign>指令(赋值,自定义局部变量)

<#assign list = sqlt.sqlQueryForList("todo_list.getList")>
<#list list as l> 
<div>
	<#assign p ="hi ${l.tid}">${p}
</div>
</#list>

在这里插入图片描述

7.字符串切分

	<#assign personName = "aBCdefgH">
    <p>${personName?length}---字符串中字符的个数 </p>
    <p>${personName?uncap_first} ----首字母小写</p>
    <p>${personName?cap_first} ----首字母大写</p>
    <p>${personName?capitalize} ----首字母大写</p>
    ${personName[0..3]}----aBCd---去数组下标0-3的字符

在这里插入图片描述

8.freemarker中的substring取子串

(1)表达式?substring(from,to)

(2)当to为空时,默认的是字符串的长度

(3)from是第一个字符的开始索引,to最后一个字符之后的位置索引

 ${'str'?substring(0)} 结果为str  
${'str'?substring(1)} 结果为tr  
${'str'?substring(2)} 结果为r  
${'str'?substring(3)} 结果为  
${'str'?substring(0,0)} 结果为  
${'str'?substring(0,1)} 结果为s  
${'str'?substring(0,2)} 结果为st  
${'str'?substring(0,3)} 结果为str  

9.自定义方法---求1到10的和

<#function getSum>
        <#assign sum = 0>
        <#list 1..10 as i>
            <#--  <#assign sum = sum + i>  -->
            <#assign sum +=  i>
        </#list>
        <#return sum>
    </#function>
    
    <h4 style="color:red">${getSum()}</h4>

在这里插入图片描述


10.list排序-升序

	升序
 	<#list list?sort_by("tid") as l> 
    <#-- 宏定义 -->
    <div>${l.tid}-${l.content}</div>
    </#list>

在这里插入图片描述

	降序-reverse
	<#list list?sort_by("tid")?reverse as l> 
    <#-- 宏定义 -->
    <div>${l.tid}-${l.content}</div>
    </#list>

在这里插入图片描述

11.list标签遍历map

	<#--freemarker map的应用-->
    <#--创建一个map,注意在freemarker中,map的key只能是字符串来作为key-->
    <#assign userMap={"1":"刘德华","2":"张学友"}/>
    <#--获取map中的值-->
    ${userMap["1"]}

在这里插入图片描述
遍历map 首选获取key的集合

 	<#--freemarker map的应用-->
    <#--创建一个map,注意在freemarker中,map的key只能是字符串来作为key-->
    <#assign userMap={"1":"刘德华","2":"张学友"}/>

    <#--获取map的keys-->
    <#assign  keys=userMap?keys/>
    <#--遍历map 首选获取key的集合-->
    <#list keys as key>
    key:${key}-value:${userMap["${key}"]}
    </#list>

在这里插入图片描述
直接遍历map的第二种方式

 <#--freemarker map的应用-->
    <#--创建一个map,注意在freemarker中,map的key只能是字符串来作为key-->
    <#assign userMap={"1":"刘德华","2":"张学友"}/>
    <#--直接遍历map的第二种方式-->
    <#list userMap?keys as key>
    key:${key}--value:${userMap["${key}"]}
    </#list>

在这里插入图片描述

	<#assign userMap={"1":"刘德华","2":"张学友"}/>
	<#--直接遍历map的values-->
    <#list userMap?values as value>
    ${value}
    </#list>

在这里插入图片描述


12.#macro>自定义指令--用户定义指令-使用@符合来调用

<#macro greet>
    <font size="+2">Hello Joe!</font>
    </#macro>
    <#--  调用宏的方法一:  -->
    <@greet></@greet> 
     <#--  调用宏的方法二:  -->
    <@greet/>

在这里插入图片描述

13.在macro指令中可以在宏变量之后定义参数

macro可以有多个参数,参数的次序是无关的, 在macro指令中只能使用定义的参数,并且必须对所有参数赋值, 可以在定义参数时指定缺省值:

 	<#macro greet1 person c="red">
        <font size="+1"  color="${c}">你好呀!${person}</font>
    </#macro>
    <@greet1 person="Alice"/>

在这里插入图片描述

14.在自定义指令嵌套内容:模板片断中使用 #nested>指令

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

在这里插入图片描述

15.在自定义指令嵌套内容:#nested>指令可以被多次调用

	<table border=4 cellspacing=0 cellpadding=4>
    <tr><td>The bordered text
    </tr></td></table>
    <#--  <#nested>指令可以被多次调用:  -->
    <#macro do_thrice>
    <#nested>
    <#nested>
    <#nested>
    </#macro>
    
    <@do_thrice>Anything.</@do_thrice>

在这里插入图片描述

16.模板中的变量,有三种类型

1.) plain(全局)变量:可以在模板的任何地方访问, 包括使用include指令插入的模板,使用assign指令创建和替换

2.) 局部变量:在macro中有效,使用local指令创建和替换

3.) 循环变量:只能存在于指令的嵌套内容, 由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量

用assign指令创建和替换
	<h5>用assign指令创建和替换</h5>
    <#assign x=1>
    ${x}
    <#assign x=x+3>
    ${x}

在这里插入图片描述

4.) 局部变量隐藏(而不是覆盖)同名的plain变量; 循环变量隐藏同名的局部变量和plain变量

5.) 内部循环变量隐藏同名的外部循环变量

	<#list ["loop 1"] as x>
        ${x}
            <#list ["loop 2"] as x>
                ${x}
                    <#list ["loop 3"] as x>
                    ${x}
                    </#list>
                ${x}<br>
            </#list>
        ${x}<br>
    </#list>

在这里插入图片描述

宏和循环(循环是数据库中真实数据)

 <#-- 宏定义 -->
    <#macro myDefine datalist=[]>
    <#list datalist as l>
    <div class="text-danger">宏和循环: ${l.tid} :${l.content}</div>
    </#list>
        
    </#macro>
    <#assign list = sqlt.sqlQueryForList("todo_list.getList")>
    <#-- 宏调用 -->
    <@myDefine datalist= list/>

在这里插入图片描述

	<#-- 带参数的宏定义 -->
    <#macro paramMacro name age>
        Hello ${name} ,年龄:${age}</font>
    </#macro>
    
    <@paramMacro name="张三" age=20/>

在这里插入图片描述

	<#-- 嵌套宏定义 -->
    <#macro myTable>
        <table border=4 cellspacing=0 cellpadding=4>
            <tr><td>
                    <#nested>
            </td></tr>
        </table>
    </#macro>
    
    <#-- 嵌套宏调用 -->
    <@myTable>我的table,我说了算</@myTable>

在这里插入图片描述


哈希表内建函数--官方代码

	<#assign h = {"name":"mouse", "price":50}>
    <#assign keys = h?keys>
    <#list keys as key>${key} = ${h[key]}; </#list>

在这里插入图片描述

freemarker中map的创建以及map的遍历循环

	<#assign maps={"1":"张三丰","2":"李思思","3":"张三强","4":"王五"}>
	
    <#assign keys = maps?keys>
     <#list keys as key>
        ${key} = ${maps[key]};
    </#list>
    <span style="color:green">取出第三个的值——${maps["3"]}</span>

在这里插入图片描述

	<#assign stu={"name":"zhangsan","age":"21","sex":"man"}>
	<#assign keys = stu?keys>
    <#list keys as key>
        ${key} = ${stu[key]};
    </#list>

在这里插入图片描述

哈希表内建函数

	<#assign opt={"1":"学习","2":"工作","3":"娱乐"}>
    
    <#assign keys = opt?keys>
    <#list keys as key>
        ${key} = ${opt[key]};
    </#list>

在这里插入图片描述


assign

assign使用:1定义简单类型

assign指令用于在页面上定义一个变量

assign指令的用法有多种,包含创建或替换一个顶层变量, 或者创建或替换多个变量等

<#assign linkman="马云">  名人:${linkman}

在这里插入图片描述

assign使用:2定义对象类型

<#assign info={"mobile":"13188886666","address":"北京市朝阳区"} >
    电话:${info.mobile} 地址:${info.address}

在这里插入图片描述

 	<#assign x>
    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", 
    "星期六", "星期天"]as n>
      ${n}<br>
    </#list>
    </#assign>
    ${x}

在这里插入图片描述

写freemarker代码的 大于(>) 判断时候要注意 有时候会被解析成#if>标签的结束 , 所以可以用 gt 比较
 <#assign u = sqlt.sqlQueryForList("todo_list.getList")>
 <#list u as uu> 
        <#--  <div>${list?size}</div>
        <div>${uu_index}</div>  -->
        <#if uu?size gt 0>
            ${uu_index}-${uu?size}<br>
        </#if>
        <#--  等效为  -->
        <#--  <#if (uu?size>0) >
            ${uu_index}
        </#if>  -->
    </#list> 

7个字段所以,列表size为7
在这里插入图片描述

	<#assign u = sqlt.sqlQueryForList("todo_list.getList")>
 	<#list u as uu>     
        <#if uu.tid<10>
            <div style="color:lightblue;font-weight:bold ">
            索引号:${uu_index}
            内容项:${uu.content}
            </div>
        </#if>    
    </#list>

在这里插入图片描述

序列和哈希的函数

 <#-- 序列和哈希的函数 -->
    <#assign seq1=2..5>
    first-${seq1?first}
    last-${seq1?last}<#-- 返回序列中最后一个数据 -->
    ${seq1?seq_contains(6)?string}
    <#-- 序列中是否包含 指定的数据 返回布尔值 需要处理 false-->
    ${seq1?seq_index_of(2)}<#-- 判断指定数据的索引位置 0-->
    ${seq1?seq_index_of(6)}<#-- 判断指定数据的索引位置 -1 -->
    ${seq1?seq_last_index_of(4)}<#-- 判断指定数据最后一次出现的索引位置 2 -->
    <#list seq1?reverse as seq><#-- 反转序列-->
        reverse---${seq}
    </#list>
    size---${seq1?size}

在这里插入图片描述

 	<#assign seq1=2..5>
	<#list seq1?sort as seq><#-- 排序序列-->
        ${seq}
    </#list>

在这里插入图片描述

	  <#assign seq2=[
        {"name":"alice","age":12},
        {"name":"prime","age":33},
        {"name":"dada","age":19},
        {"name":"tom","age":48}
    ]>
    <#list seq2?sort_by("name") as seq><#-- 指定排序规则进行排序序列-->
        name:${seq.name},age:${seq.age}<br>
    </#list>

在这里插入图片描述

 	<#assign user={"name":"xiaomi","age":11,"address":"dalian"}>
    <#list user?keys as key><#-- 获取hash中所有的key值 -->
        ${key}
    </#list>
    <br>
    <#list user?values as value><#-- 获取hash中所有的value值 -->
        ${value}
    </#list>

在这里插入图片描述
在数据模型中放置了一个方法变量avg,那么它就可以被用来计算数字的平均值
avg求平均值

	<#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>
   
    <div>
        The average of 3 and 5 is: ${avg(3, 5)}
        <br>
        The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
    <#--  ${avg(3,5,20)}   -->
    </div>

在这里插入图片描述

什么方法和函数有什么区别呢?这是模板作者所关心的, 它们没有关系,但也不是一点关系都没有。 方法是来自于数据模型 (它们反射了Java对象的方法) 而函数是定义在模板内的 (使用 function 指令 -- 也是高级话题), 但二者可以用同一种方式来使用

指令有两种类型:预定义指令 和用户自定义指令.预定义指令的例子:if, list,include

${(5 + 8)/2}

在这里插入图片描述

Freemarker 中的哈希表(Map)和序列(List)

freemarlker中的容器类型有:

  • 哈希表:是实现了TemplateHashModel或者TemplateHashModelEx接口的java对象, 经常使用的实现类是SimpleHash,该类实现了TemplateHashModelEx接口。 从内部讲它使用一个java.util.Hash类型的对象存储子变量
  • 序列:是实现了TemplateSequenceModel接口的Java对象。 经常使用的实现类是SimpleSequence, 该类内部使用一个java.util.List类型的对象存储它的子变量
  • 集:是实现了TemplateCollectionModel接口的java对象。 通常使用的实现类是SimpleCollection。

模板文件中哈希表的相关操作

	<#--  创建一个map,注意key只能是字符串  -->
    <#assign maps={"1":" 张三 ","2":" 李四 "}>
    ${maps["1"]}
    <br>
    <#assign testMap={"test1":2335,"test2":23445}>
    <#--  获取map中的值  -->
    ${testMap["test1"]}
    <#--  获取map长度  -->
    ${testMap?size}
    <hr>
    <#--  获取map的keys  -->
    <#assign keys = testMap?keys>
    <#--  遍历map 首选获取key的集合  -->
    <#list keys as key>
        key:${key}-value:${testMap["${key}"]}<br>
    </#list>
    <hr>
    <#--  直接遍历map的第二种方式  -->
    <#list testMap?keys as key>
        key:${key}--value:${testMap['${key}']}<br>
    </#list>
    <hr>
    <#--  直接遍历map的values  -->
    <#list testMap?values as value>
        value:${value}<br>
    </#list>

在这里插入图片描述

模板文件中序列的相关操作

  	<#--  第一种定义序列的方式  -->
    <#assign nums =[1,2,3,4,5,77,8,9999]>
    <#--  获取序列的长度  -->
    ${nums?size}
    <#--  根据索引获取序列中的值  -->
    ${nums[2]}

在这里插入图片描述

	<#assign nums =[1,2,3,4,5,77,8,9999]>
	<#list nums as num>
    元素:${num},数组下标(索引):${num_index}
    <br>
    </#list>

在这里插入图片描述

	<#assign nums =[1,2,3,4,5,77,8,9999]>
	<#--  第二种定义序列的方式,定义连续的序列,  -->
    <#assign nums1 =12..19>
    <#list nums1 as num1>
    元素:${num1},数组下标(索引):${num1_index}
    <br>
    </#list>

在这里插入图片描述

   ${"1,2,3,4,5,77,8,99"[1..4]}<#--  逗号占一位  -->
    <#--  ,2,3  -->
    <hr>
    ${"1 2 3 4 5 77 8 99"[1..4]}<#--  空格占一位  -->
    <#--  2 3  -->

序列(List)

	<#assign mynums=[11,12,13,14,15,16,17,18,19]/>   
    <#list mynums as mn>   
        ${mn}   
    </#list> 

在这里插入图片描述

拆分序列

	<#assign mynums=[11,12,13,14,15,16,17,18,19]/>   
	<#assign mynum01=mynums[3..6]/>   
    <#list mynum01 as mn01>   
        ${mn01}   
    </#list>

在这里插入图片描述

<#--  字符串的拆分   -->
    ${"你好,你来了吗今天看书了吗!"[0..8]}... 

在这里插入图片描述

连续序列

 <#-- 从55到58:注意此时若写成[55..58]或者[66..68]则会报错 -->   
    <#assign num01=55..58/>   
    <#list num01 as num>   
        ${num}   
    </#list>   
    <hr>
    <#list 66..68 as num>   
        ${num}   
    </#list>

在这里插入图片描述
在这里插入图片描述

哈希表(Map)

 	<#assign maps={"1":" 张三 ","2":" 李四 "}>
    ${maps["1"]}
    <hr>
    <#-- 以下代码可以将 map 的 key 转换为相应的序列 -->

    <#assign keys=maps?keys>

    <#list keys as key>

    ${key}---${maps[key]}

    </#list>

在这里插入图片描述

 	<#assign users={"username":" 张三 ","password":"123"}>

    ${users.username}---${users["password"]}

在这里插入图片描述

注意:

FreeMarker中的哈希表要求其key必须是字符串,包括数据模型中的java.util.HashMap的key也要是字符串,否则报错

不能直接用list遍历map,需要先将map的key转换为相应的序列

   &nbsp;&amp;
   &lt; &gt;&amp;&quot;&copy;分别是<,>,&,",©;的转义字符。

猜你喜欢

转载自blog.csdn.net/weixin_41056807/article/details/99301674