freemarker自学2.0"/>
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转换为相应的序列
&< >&"©分别是<,>,&,",©;的转义字符。
更多推荐
freemarker自学2.0
发布评论