四.javaWeb-FreeMarker学习

一.FreeMarker介绍

FreeMarker学习网站

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

二.freemarker的基本标签

${selectDto.stuName?ifExists}相当于el表达式的${selectDto.stuName}

设置单选框在selectDto.exact==1时选中
${(selectDto.exact==1)?string(“checked”,“”)}相当于el表达式的${selectDto.exact==1?“checked”:“”}

判断stu.stuSex对象是否存在
${stu.stuSex ??} 相当于el表达式中的${empty stu.stuSex}

多重判断(通过stu.stuStatus的值判断)
<#if (stu.stuStatus==0)>
未注册
<#elseIf (stu.stuStatus==1)>
已注册
<#elseIf (stu.stuStatus==-1)>
休学
</#if>
相当于el表达式的
<c:choose>
<c:when test=“${stu.stuStatus==0}”>
未注册
</c:when>
<c:when test=“${stu.stuStatus==1}”>
已注册
</c:when>
<c:when test=“${stu.stuStatus==-1}”>
休学
</c:when>
</c:choose>

遍历list
<#list page.list! as stu>
${stu.stuName}
</#list>
相当于el表达式的
<c:forEach items=“${page.list}” var=“stu”>
${stu.stuName}
</c:forEach>

${stu.stuNo}为3位数以上时,数字之间会出现逗号
可以使用${stu.stuNo?c}但是当stu.stuNo不存在是会显示false

三.freemarker的基本语法

freemarker的基本语法及入门基础

一、freemarker模板文件(*.ftl)的基本组成部分
1. 文本:直接输出的内容部分
2. 注释:不会输出的内容,格式为<#-- 注释内容 -->
3. 取值(插值):代替输出数据模型的部分,格式为${数据模型}或#{数据模型}
4. ftl指令:Freemarker指令,类似于HTML标记。
内建指令:开始标签:<#directivename parameter> 结束标签:</#directivename> 空标签:<#directivename parameter/>
自定义指令:开始标签:<@directivename parameter> 结束标签:/@directivename 空标签:<@directivename parameter/>
至于什么是内建指令,什么是自定义指令 我会在下面叙述到。
在这里插入图片描述

二、Freemarker语法及使用方法
1. 取值(插值)指令及适用类型:
(1) ${var}
适用类型:java中常用的八大基本类型以及我们的String引用类型,但是,freemarker中boolean类型显示时true==yes false==no
示例:
在后台文件中定义变量
String strVar = “世界你好”;
int intVar = 10;
boolean booVar = true;
在页面中获取变量:
String获取:<font color=“red”> ${strVar}

int获取:<font color=“red”> ${intVar}

boolean获取:<font color=“red”> b o o V a r ? s t r i n g ( " y e s " , " n o " ) < / f o n t > 展示结果: S t r i n g 获取:世界你好 i n t 获取: 10 b o o l e a n 获取: y e s ( 2 ) {booVar?string("yes","no")} </font> 展示结果: String获取:世界你好 int获取:10 boolean获取:yes (2) booVar?string("yes","no")</font>展示结果:String获取:世界你好int获取:10boolean获取:yes(2){var!}
适用类型:对 null 或者不存在的对象进行取值,可以设置默认值,例:${var!‘我是默认值’} 即,有值时显示正常值,无值时显示默认值
示例:
在后台文件中定义变量
String strVar = “世界你好”;
String str = null;
在页面中获取变量:
String获取:<font color=“red”> ${strVar!“我是空”}

str获取:<font color=“red”> ${str!}

str获取:<font color=“red”> s t r ! " 默认 " < / f o n t > < b r > 展示结果: S t r i n g 获取:世界你好 s t r 获取: s t r 获取:默认 ( 3 ) {str!"默认"} </font><br> 展示结果: String获取:世界你好 str获取: str获取:默认 (3) str!"默认"</font><br>展示结果:String获取:世界你好str获取:str获取:默认(3){封装对象.属性}
适用类型:对封装对象进行取值,例:${User.name}
示例:
在后台文件中封装对象User[ name, age ]
String name = “姓名”;
int age = 18;
在页面中获取变量:
name获取:<font color=“red”> ${User.name}

age获取:<font color=“red”> U s e r . a g e < / f o n t > < b r > 展示结果: n a m e 获取:姓名 a g e 获取: 18 ( 4 ) {User.age} </font><br> 展示结果: name获取:姓名 age获取:18 (4) User.age</font><br>展示结果:name获取:姓名age获取:18(4){date?String(‘yyyy-MM-dd’)}
适用类型:对日期格式进行取值,在这里我要强调的是,定义Date类型的变量时,java.util.Date无法输出日期,须使用java.sql.Date
示例:
在后台文件中定义变量
java.sql.Date date = new Date().getTime();
java.sql.Date time = new Date().getTime();
java.sql.Date datetime = new Date().getTime();
在页面中获取变量:
date获取:<font color=“red”> ${date?string(‘yyyy-MM-dd’)}

time获取:<font color=“red”> ${date?string(‘HH:mm:ss’)}

datetime获取:<font color=“red”> d a t e ? s t r i n g ( ′ y y y y − M M − d d H H : m m : s s ′ ) < / f o n t > < b r > 展示结果: n a m e 获取:姓名 a g e 获取: 18 ( 5 ) {date?string('yyyy-MM-dd HH:mm:ss')} </font><br> 展示结果: name获取:姓名 age获取:18 (5) date?string(yyyyMMddHH:mm:ss)</font><br>展示结果:name获取:姓名age获取:18(5){var?html}
适用类型:转义HTML内容
示例:
在后台文件中封装变量Menu[ name, model ]
Menu m = new Menu();
m.setName(" freemarker “);
m.setModel(”<font color = ‘red’>我只是个菜单");
在页面中获取变量:
非转义获取:<font color=“red”> ${m.model}

转义获取: ${m.model?html}

展示结果:
非转义获取:我只是个菜单
转义获取:<font color = ‘red’>我只是个菜单
(6)<#assign num = 100 />
适用类型:定义变量,支持计算和赋值
示例:
在页面中定义变量:
<#assign num = 100 />
num获取:<font color=“red”> ${num)}

计算结果:<font color=“red”> ${num * 10}

展示结果:
num获取:100
计算结果:1000
(7)对List集合进行取值
<#list list集合 as item>
${item} --取值
</#list>
示例:
在后台文件中定义变量
List strList = new ArrayList();
strList.add(“第一个值”);
strList.add(“第二个值”);
strList.add(“第三个值”);
在页面中获取变量:
<#list strList as item>
${item!}
--取值
</#list>
展示结果:
第一个值
第二个值
第三个值
(8)对Map集合进行取值
<#list map?keys as key>
k e y : {key}: key:{map[key]}
</#list>
示例:
在后台文件中定义变量
Map<String, Object> m = new HashMap<String, Object>();
m.put(“name”,“姓名”);
m.put(“age”,18);
m.put(“sex”,“男”);
在页面中获取变量:
<#list m?keys as key>
k e y : {key}: key:{m[key]}
</#list>
展示结果:
name:姓名
age:18
sex:男
2. 条件判断指令:
(1) if
格式:<#if 条件>
输出
</#if>
示例:
在页面中定义变量并判断条件:
<#assign age = 18 />

<#if age == 18>
<font color=“red”> age = 18
</#if>
展示结果:
age = 18
(2) if - else
格式:<#if 条件>
输出
<#else>
输出
</#if>
示例:
在页面中定义变量并判断条件:
<#assign age = 20 />

<#if age == 18>
<font color=“red”> age = 18
<#else>
<font color=“red”> age != 18
</#if>
展示结果:
age != 18
(3) if - elseif - else
格式:<#if 条件1>
输出
<#elseif 条件2>
输出
<#else>
输出
</#if>
示例:
在页面中定义变量并判断条件:
<#assign age = 20 />

<#if age > 18>
<font color=“red”>青年
<#elseif age == 18>
<font color=“red”> 成年
<#else>
<font color=“red”> 少年
</#if>
展示结果:
成年
(4) switch --常与case break default一起使用 参数可为字符串
格式:<#switch var>
<#case 条件1>
输出
<#break>
<#case 条件2>
输出
<#break>
<#default>
输出
</#switch>
示例:
在页面中定义变量并判断:
<#switch var=“星期一”>
<#case “星期一”>
油焖大虾
<#break>
<#case “星期二”>
炸酱面
<#break>
<#default>
肯德基
</#switch>
展示结果:
油焖大虾
3. 自定义函数、自定义指令:
(1) 自定义函数
实现TemplateMthodModelEx
(2) 自定义指令
实现TemplateDirectiveModel
示例:
<@自定义指令名称 入参(key-value格式) ; 出参(list格式)>
运行条件
</@自定义指令名称>

PS:不同的返回值用逗号( , )间隔开

4.常用内建函数、macro(宏指令)、function(函数指令):
(1) 常用内建函数
处理字符串:
substring 截取字符串,包头不包尾(下标)
cap_first 第一个字母大写
end_with 以什么字母结尾
contains 是否包含目标字符串
date datetime time 转换成日期格式
starts_with 以什么字母开头
index_of 返回某个指定的字符串值在字符串中首次出现的位置(下标)
last_index_of 获取指定字符出现的最后位置(下标)
split 分隔
trim 去两端空格
处理数字:
string
x?string(“0.##”) 变成小数点后几位
round 四舍五入
floor 去掉小数点
ceiling 近1 变成整数
处理list:
first: 取List值第一个值
last: 取List值最后一个值
seq_contains: 是否包含指定字符
seq_index_of: 指定字符所在位置
size: 集合大小
reverse: 集合倒序排列
sort: 对集合进行排序
sort_by: 根据某一个属性排序
chunk: 分块处理
其他:
is_string: 是否为字符类型
is_number: 是否为整数类型
is_method: 是否为方法
(): 判断整个变量
has_content: 判断对象是否为空或不存在
eval: 求值
(2) macro(宏指令)
调用:<@macro_name param />
语法:<#macro 变量名 参数>
<#nested/>
</#macro>
(3) function(函数指令)
调用:${function_name(param)}
语法:<#function 变量名 参数>
<#return>
</#function>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值