最新要闻

广告

手机

光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯

光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯

搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注

搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注

家电

FreeMarker指令语法【FreeMarker】

来源:博客园

一、基础语法种类

1.1 注释,即 <#-- -->,介于其之间的内容会被 FreeMarker 忽略

<#-- 我是一个FreeMarker注释 -->

1.2 插值(Interpolation):即 ${..} 部分,FreeMarker 会用真实的值代替 ${..}


(资料图)

Hello ${name}

1.3 FTL指令:和 HTML标记类似,名字前加 # 予以区分,FreeMarker 会解释标签中的表达式或逻辑

<# > FTL指令 

1.4 文本,仅文本信息,这些不是 FreeMarker 的注释、插值、FTL指令的内容会被 FreeMarker 忽略分析,直接输出内容

<#-- FreeMarker 中的普通文本 -->我是一个普通的文本

二、遍历 List 集合

指令格式

<#list ListName as 别名>  ${别名.属性}  ${别名_index}   下标从 0 开始  ${别名_index + 1} 下标从 1 开始

三、获取 Map 中的数据

取单个值方式一    ${MapName["keyname"].property}方式二    ${MapName.keyname.property}
遍历 Map 中的数据<#list MapName?keys as key>    ${key_index + 1}    ${MapName[key].属性}

四、if 指令

<#if expression><#else>

注意事项:在 FreeMarker中,判断是否相等,= 与 == 是一样的。

五、运算符

5.1 算术运算符

加法+
减法-
乘法*
除法/
求模(求余)%
100+5 运算:  ${100 + 5}100-5*5运算:  ${100 - 5 * 5}5/2运算:${5 / 2}12 % 10运算:${12 % 10}

5.2 比较运算符

比较运算符说明
= 或者 ==判断两个值 是否 相等
!=判断两个值 是否 不等
> 或者 gt判断 左边值 是否 大于 右边值
>= 或者 gte判断 左边值 是否 大于等于 右边值
< 或者 lt判断 左边值 是否 小于 右边值
<= 或者 lte判断 左边值 是否 小于等于 右边值

注意事项

= 和 != 可以用于字符串、数值和日期来比较是否相等

= 和 != 两边必须是相同类型的值,否则会产生错误

字符串 "x"、"x "、"X" 比较是不等的,因为 FreeMarker 是精确比较

gt 代替 > ,FreeMarker 会把 > 解释成 FTL 标签的结束字符,可使用括号避免这种情况,如:<#if(x>y)>

5.3 逻辑运算符

逻辑与&&
逻辑或||
逻辑非!
<#if (10 lt 12)&&(10 gt 5)>    (10 lt 12)&&(10 gt 5)  显示为 true

<#if !false> false 取反为 true

5.4 空值处理

1、判断某变量是否存在使用"??"

用法为

variable??

如果该变量存在,返回 true,否则返回 false

<#if stus??>    <#list stus as stu>        ......    

2、缺失变量默认值使用"!"

使用 ! 要以指定一个默认值,当变量为空时显示默认值

例:${name!""}  表示如果 name 为空 显示空字符串

如果是嵌套对象则建议使用()括起来

例:${(stu.name)!""} 表示,如果 stu 或 name 为空 默认显示空字符串

六、内建函数

内建函数语法格式: 变量 + ? + 函数名称

1. 集合的大小    ${集合名?size}2.日期格式化    显示年月日: ${today?date}    显示时分秒: ${today?time}    显示日期+时间: ${today?datetime}    自定义格式化: ${today?string("yyyy年MM月")}3.内建函数c    model.addAttribute("point", 102920122);        point 是数字型,使用 ${point}会显示这个数字的值,每三位使用逗号分隔。    如果不想显示为每三位分隔的数字,可以使用 c函数 将数字型转成字符串输出。        ${point?c}4.将 json字符串 转成 对象    其中用到了 assign标签,assign的作用是定义一个变量    <#assign text="{"bank":"工商银行","account":"10101920201920212"}" />    <#assign data=text?eval />    开户行: ${data.bank}    账号: ${data.account}

七、静态文件生成

7.1 实现思路

7.2 代码实现示例

package com.heima.freemarker.test;import com.heima.freemarker.FreemarkerDemoApplication;import com.heima.freemarker.entity.Student;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.io.FileWriter;import java.io.IOException;import java.util.*;@SpringBootTest(classes = FreemarkerDemoApplication.class)@RunWith(SpringRunner.class)public class FreemarkerTest {    @Autowired    private Configuration configuration;    @Test    public void test() throws IOException, TemplateException {        Template template = configuration.getTemplate("02-list.ftl");        /**         * 合成方法         * 两个参数         * 第一个参数: 模型数据         * 第二个参数: 输出流         */        template.process(getData(), new FileWriter("C:/VmWare/hmtt/IO/list.html"));    }    private Map getData() {        Map map = new HashMap<>();        //------------------------------------        Student stu1 = new Student();        stu1.setName("小强");        stu1.setAge(18);        stu1.setMoney(1000.86f);        stu1.setBirthday(new Date());        //小红对象模型数据        Student stu2 = new Student();        stu2.setName("小红");        stu2.setMoney(200.1f);        stu2.setAge(19);        //将两个对象模型数据存放到List集合中        List stus = new ArrayList<>();        stus.add(stu1);        stus.add(stu2);        //向model中存放List集合数据        map.put("stus",stus);//        model.addAttribute("stus",stus);        //------------------------------------        //创建Map数据        HashMap stuMap = new HashMap<>();        stuMap.put("stu1",stu1);        stuMap.put("stu2",stu2);        // 3.1 向model中存放Map数据//        model.addAttribute("stuMap", stuMap);        map.put("stuMap", stuMap);        //日期//        model.addAttribute("today", new Date());        map.put("today", new Date());        //长数值//        model.addAttribute("point", 89647844547125L);        map.put("point", 89647844547125L);//        return "02-list";        return map;    }}

application.yml 配置

server:  port: 8881 #服务端口spring:  application:    name: freemarker-demo #指定服务名  freemarker:    cache: false  #关闭模板缓存,方便测试    settings:      template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试    suffix: .ftl               #指定Freemarker模板文件的后缀名    template-loader-path: classpath:/templates  #模板生成位置

关键词: