菜鸟笔记1——Freemarker
Freemarker
概括
Freemarker模板与HTML页面是很相似的,freemarker包含有 文本、注释、
插值和ftl指令。文本是直接输出的;注释格式:<#-- 注释 0--> ;
插值:${值}或者#{值};ftl指令:freemarker标签与HTML标签类似,
有一部分标签例如<#list a as b><#list> 括号内要加#用以区分。
freemarker中遇到过最多的问题就是语法格式错误,所以一定要注意!
示例:
<!DOCTYPE html>
<head>
<title>${title}</title>
<#include "include/head.ftl">
<script src="${path}/js/video-ckin.js"></script></head>
<body>
<!--头部导航 start-->
<#include "include/header.ftl">
<!--banner-->
<div class="news-detail-banner">
</div>
<!--detail详情-->
<#assign datamodel=getDataModel(id,"article")>
<#if datamodel??>
<div class="page-main">
<div class="news-detail">
<h1>${datamodel.title}</h1>
<span>${datamodel.createDate?string('yyyy/MM/dd')!}</span>
<p>${datamodel.content}</p>
<img src="${datamodel.picimg}" width="" height="" />
<#assign uploads=listUpload(datamodel.id,"tbl_article","V")>
<#if uploads[0].viewPath??>
<div class="video-main">
<video controls="controls" src="${uploads[0].viewPath}" data-ckin="default" data-overlay="1" width="" height="" object-fit="fill"></video>
</div>
</#if>
</div>
</div>
</#if>
<!--底部 start-->
<#include "include/footer.ftl">
<!--底部 end-->
<!--右侧导航 start-->
<#include "include/rightbase.ftl">
<!--右侧导航 end-->
<!--js调用-->
<script src="${path}/js/jquery-1.8.3.min.js"></script>
<!--左侧添加样式JS-->
<script>
$(document).ready(function(){
方法内容...
});
}
</script>
</body>
</html>
集合遍历
假设集合a里面包含{星期一 星期二 星期三 星期四 星期五 星期六 星期天 }这些元素,
那么下面就可以遍历输出各个元素值;
<#list a as b>
${b}
<#list>
输出结果:星期一 星期二 星期三 星期四 星期五 星期六 星期天 。
条件判断-if、switch、case、default、break
if语句:
<#if condition>
做事件1
<#elseif condition>
做事件2
<#elseif condition>
做事件3
<#else>
做事件4
</#if>
示例:
定义一个参数 <#assign flag=85>
<#if (falg>60)>
优秀
<#else>
加油哦
</#if>
结果:优秀
<#-----------------------假装分割线---------------------------->
switch语句:
<#switch value>
<#case refValue>
事件一
<#break>
<#case refValue>
事件二
<#break>
<#default>
事件三
</#switch>
日期格式化
示例:
${date?string("yyyy-MM-dd HH:mm:ss zzzz")}
${date?string("EEE, MMM d, ''yy")}
${date?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}
输出结果是依次为:
2008-04-08 08:08:08 Pacific Daylight Time
Tue, Apr 8, '03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)
数字格式化
数字格式化用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
示例:
<#assign x=3.582/>
<#assign y=4/>
#{x; M2} <#-- 输出3.58 -->
#{y; M2} <#-- 输出4 -->
#{x; m2} <#-- 输出3.6 -->
#{y; m2} <#-- 输出4.0 -->
#{x; m1M2} <#-- 输出3.58 -->
#{x; m1M2} <#-- 输出4.0 -->
运算符
表达式中支持的**比较运算符**:
1,=或者==:判断两个值是否相等.
2,!=:判断两个值是否不等.
3,>或者gt:判断左边值是否大于右边值
4,>=或者gte:判断左边值是否大于等于右边值
5,<或者lt:判断左边值是否小于右边值
6,<=或者lte:判断左边值是否小于等于右边值
表达式中支持的**逻辑运算符**:
逻辑与:&&
逻辑或:||
逻辑非:!
需要注意的是---逻辑运算符只能作用于布尔值,否则会报错。
内建函数
用以转换输出格式:
可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量。
cap_first:使字符串第一个字母大写
lower_case:将字符串转换成小写
upper_case:将字符串转换成大写
trim:去掉字符串前后的空白字符
size:获取序列中元素的个数
int:取得数字的整数部分,结果带符号
html:对字符串进行HTML编码
var?length :取得字符串长度
示例:
<#assign test="Aa & Bb">
${test?html}
${test?upper_case?html}
结果是:Aa &Bb; Jerry AA & BB
类似String.indexof:
“babcdabcd”?index_of(“abc”) 返回1
“babcdabcd”?index_of(“abc”,2) 返回5
空值处理运算符
对于一个Java的 null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它并不认识null值,null值和不存在的变量完全相同。
为了解决缺失变量的问题,FreeMarker提供了两个运算符:
!:指定缺失变量的默认值
??:判断某个变量是否存在
示例:
值! 或 值!默认值,不给默认值 和 给默认值 两种
??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false 。
关键字
item_index:是list当前值的下标
item_has_next:判断list是否还有值
替换字符串 replace :
${s?replace(‘ba’, ‘XY’ )}
${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}将s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下:
i:大小写不区分.
f:只替换第一个出现被替换字符串的字符串
r: XY是正则表达式
一些内置方法
**sequences内置方法**
sequence?first
返回sequence的第一个值;前提条件sequence不能是null
sequence?last
返回sequence最后一个值
sequence?reverse
反转sequence的值
sequence?size
返回sequence的大小
sequence?sort
对sequence按里面的对象toString()的结果进行**排序**
sequence?sort_by(value)
对sequence 按里面的对象的属性value进行排序
如: sequence里面放入的是10 个user对象,user对象里面包含name,age等属性
sequence?sort_by(name) 表示所有的user按user.name进行排序
**hashes内置方法**
hash?keys
返回hash里的所有keys, 返回结果类型sequence
hash?values
返回hash里的所有value, 返回结果类型sequence
写给自己!