部分内容连接数据库
<#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转换为相应的序列
&
< >&"©分别是<,>,&,",©;的转义字符。