freemarker使用教程,layui菜鸟教程
另一方面,认识到FreeMarker FreeMarker是模板引擎。 是基于模板生成输出文本的通用工具。 模板引擎包括Velocity、Common Template等。
对于java web开发,可以使用FreeMarker模板将java代码与页面分离。 开发人员只需要关注业务逻辑代码,页面设计人员只需要设计成显示效果,两种类型的人员就能各自发挥作用,发挥出擅长的一面。
FreeMarker注释:类似于HTML的注释,用#----和---分隔。 FreeMarker将忽略这两个分隔符(包括分隔符本身)之间的任何分隔符,既不执行也不输出。
二、常用命令if指令if命令进行条件输出控制,类似于程序语言的if语句。
格式:
# ifcondition content/# if # ifcondition content # elseothercontent/# if示例:
#if username=='boss'Hi boss! /#if#if username=='boss'Hi boss! #elseHi! /#if
说明:上述示例表示如果变量username的值为“boss”,则输出Hi boss! 否则输出Hi!
==是确定两侧值相等的运算符,比较结果为布尔值、true或false。==的左侧是引用的变量,右侧是指定的字符串。
注意:右边字面的量可以是字符串,也可以是数字。 对于字符串,必须用引号(可以是单引号,也可以是双引号)括起来,==左右类型匹配。 如果不一致,将发生错误。
list指令list命令用于遍历集合中的内容。
格式:
# listvarsasvarrepeatcontent/# list示例:
#list [ '星期一'、'星期二'、'星期三' ] as day${day}/#list
说明:上例输出3行,每行按星期一、星期二、星期三的顺序输出。
集合中的元素可以是简单字符串,也可以是复杂对象,如上例所示
assign命令assign命令用于定义变量并为其赋值,或替换原始变量的值
格式:
# assign name=value [ name1=value1. ] # assignnamecapturethis/# assign示例:
#assign username='master '
说明:
后者的形式是复杂的使用方法。 将assign对的内容输出为name变量的值
可以使用33558www.Sina.com/include命令将其他文件的内容插入到当前模板中。
格式:
#include 'filepath '
示例:
# include '/copyright _ footer.html '
说明:
所捕获的文件可以是静态页或动态页,也就是说,它可以是ftl模板。 在与数据模型组合输出之前,include命令将文件内容包含在当前模板中。
如果未定义变量的处理或值为null变量未定义,或者值为null,则默认情况下FreeMarker报告错误。 有两种处理方法
1 .设置默认值
格式:
${varname! default_value}示例:
$ {用户! ' visitor'}${apple.price! 0 )说明:有关多级访问变量,如animals.python.price,请编写代码: ${animals.python.price! 0}、animals或python不存在时,模板处理过程将因“未定义的变量”错误而停止。 为了防止这种情况发生,可以这样编写代码${(animals.python.price )! 0 )。 在这种情况下,如果animals或python不存在,表达式的结果将保留为0。
2 .加if判断
格式:
#if varname? 内容/# if # if varname? 退出内容/# if示例:
#if user? Hi,${user}/#if#if user? 退出
>Hi,${user}</#if>说明:
如果user变量存在,且值不为NULL时,才输出Hi,user变量值。同样对于多级访问的变量,??前面的变量名最好被()包含,原因参照!设置默认值。
3.修改全局配置
classic_compatible=true
当FreeMarker指定为"Classic Compatibile"(兼容经典)模式运作时,引擎将会按下列方式输出:
1.友好的处理未定义表达式(即不报错),所谓未定义表达式,就是指“expr”变量未定义,或值为null.
像<assign varname=expr>、${expr}、“otherexpr == expr”、“otherexpr != expr”、hash[expr]中expr未定义时当成空字符串对待
像<list expr as item>、<foreach item in expr>中expr未定义时,循环体不会执行(就像expr是一个空List一样)
像用在<if>指令中或作为布尔表达式时,空值将被当成是false来处理。非布尔数据模型或者逻辑操作数也可以放在<if>指令中,空模型(长度为零的字符串,空的数组或者hash集合)被当成是false来对待,其他情况下都被当成是true来处理。
2.布尔值被看作字符串时(比如用${...}输出,或者是和其他字符串连接时),true值将被转换成“true”字符串处理,false值将被转换成空字符串
3.传给<list>和<foreach>的标量模型被当成只包含一个该元素的list来处理。
4.<include>指令的路径参数将被作为绝对路径处理
字符串:"Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者"C:\raw\string"
数字:123.45
布尔值:true, false
序列:["foo", "bar", 123.45], 1..100
哈希表:{"name":"green mouse", "price":150}
顶层变量:user
从哈希表中检索数据:user.name, user[“name”]
从序列中检索:products[5]
特殊变量:.main
插值(或连接):"Hello ${user}!"(或"Free" + "Marker")
获取一个字符:name[0]
连接:users + ["guest"]
序列切分:products[10..19] 或 products[5..]
连接:passwords + {"舒适的钥匙":"secret42"}
算数运算(x * 1.5 + 10) / 2 - y % 100
比较运算x == y, x != y, x < y, x > y, x >= y, x <= y, x < y, x > y 等等
逻辑操作!registered && (firstVisit || fromEurope)
内建函数name?upper_case
方法调用repeat("What", 3)
处理不存在的值指定默认值:name!"unknown" 或name! 多级访问变量(user.name)!"unknown" 或者 (user.name)!
检测不存在的值:name?? ,(user.name)??
当数字超过3位的时候,默认输出会自动带上逗号。例如2000,会显示为2,000。还有当小数位数超过3位时,默认只显示小数点后3位。例如1.33213,会显示为1.332;1.33253,会显示为1.333;
如何解决呢?
1> 加?c,即转成字符串,如:${userId?c}2> 修改配置文件freemarker.properties加上number_format=#
五、格式化输出${xx?c} //转成字符串显示
${xx?string.number}//按数字显示
${xx?string.currency}//按贷币格式显示
${xx?string.percent} //按百分比格式显示
${xx?trim}
七、格式化日期${date?string("yyyy-MM-dd HH:mm:ss")}
${date?string("yyyyMMdd")}