freemarker自学2.0

编程入门 行业动态 更新时间:2024-10-06 20:36:51

<a href=https://www.elefans.com/category/jswz/34/1761218.html style=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转换为相应的序列

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

更多推荐

freemarker自学2.0

本文发布于:2024-02-13 20:12:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760192.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:freemarker

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!