当前位置: 首页 > news >正文

Freemarker模板

1.概述

FreeMarker模板文件主要有5个部分组成:

  1. 数据模型:模板能用的所有数据
  2. 文本,直接输出的部分
  3. 注释,即<#–…–>格式不会输出
  4. 插值(Interpolation):即${…}或者#{…}格式的部分,将使用数据模型中的部分替代输出
  5. FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。

2.数据模型

FreeMarker(还有模板开发者)并不关心数据是如何计算的,FreeMarker 只是知道真实的数据是什么。模板能用
的所有数据被包装成 data-model 数据模型

3.模板的常用标签

在FreeMarker模板中可以包括下面几个特定部分:

  1. ${…}:称为interpolations,FreeMarker会在输出时用实际值进行替代。
    ${name}可以取得root中key为name的value。
    ${person.name}可以取得成员变量为person的name属性
  2. <#…>:FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记区分
  3. <@>:宏,自定义标签
  4. 注释:包含在<#–和–>(而不是)之间

4.模板的常用指令

  • if指令
    分支控制语句
   	  <#if condition>....<#elseif condition2>...<#elseif condition3>      ...<#else>...</#if>
  • list、break指令
    list指令时一个典型的迭代输出指令,用于迭代输出数据模型中的集合
  	   <#list sequence as item>...</#list>除此之外,迭代集合对象时,还包括两个特殊的循环变量:a、item_index:当前变量的索引值。b、item_has_next:是否存在下一个对象也可以使用<#break>指令跳出迭代<#list ["星期一","星期二","星期三","星期四","星期五"] as x>${x_index +1}.${x} <#if x_has_next>,</#if><#if x = "星期四"><#break></#if></#list>
  • include 指令
    include指令的作用类似于JSP的包含指令,用于包含指定页,include指令的语法格式如下
 <#include filename [options]></#include>在上面的语法格式中,两个参数的解释如下a、filename:该参数指定被包含的模板文件b、options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,encoding 指定包含页面时所使用的解码集,而parse指定被包含是否作为FTL文件来解析。如果省略了parse选项值,则该选项值默认是true
  • assign指令
    它用于为该模板页面创建或替换一个顶层变量
<#assign name = zhangsan />
  • 内置函数
    FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可通过内建函
    数来转换输出变量。下面是常用的内建的字符串函数:
		 ?html:html字符转义?cap_first: 字符串的第一个字母变为大写形式?lower_case :字符串的小写形式?upper_case :字符串的大写形式?trim:去掉字符串首尾的空格?substring:截字符串?lenth: 取长度?size: 序列中元素的个数?int : 数字的整数部分(比如- 1.9?int 就是- 1)\?replace:字符串替换

示例:

<#-- assign指令 : 再ftl模板中定义数据存入到root节点下
<#assign name="zhangsan">
--><#--
${name}欢迎您:${username}
-->
<#-- 获取数据  ${根节点下的数据....属性} --><#-- if指令
<#if flag=1>传入数据=1<#elseif flag=2>传入数据=2<#else>传入数据=其他
</#if>--><#-- list指令 : 循环迭代数据名称 as 别名<#list weeks as abc>${abc_index} =  ${abc}
</#list>
--><#--模板包含 include
<#include "template02.ftl" >
-->${username?lower_case}

相关文章:

  • React Native 项目搭建设置或取消git全局代理
  • 影视企业有哪些方式将视频文件快速海外跨国传输国内?
  • Xcode15 模拟器 Rosetta 模式
  • springboot-2.7.3+ES-7.10.0
  • MODBUS通讯
  • Vue3使用Monaco-editor
  • 视频列表:点击某个视频进行播放,其余视频全部暂停(同时只播放一个视频)
  • java实体类全部复制到新类及部分复制到新类
  • 2024最新最全:【Windows10】u盘安装系列教程【附安装包】
  • 【笔记】Arrays.binarySearch()实践,以及需要注意的一些问题点
  • Python画图之HelloKitty
  • overflow溢出属性、定位、前端基础之JavaScript
  • 手写一个uniapp的步骤条组件
  • OSPF高级特性2(特殊区域,聚合)
  • 【Linux基础IO篇】系统文件接口(1)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • java第三方包学习之lombok
  • js面向对象
  • JWT究竟是什么呢?
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Material Design
  • Puppeteer:浏览器控制器
  • Terraform入门 - 1. 安装Terraform
  • Vue 重置组件到初始状态
  • Vultr 教程目录
  • 翻译:Hystrix - How To Use
  • 关于字符编码你应该知道的事情
  • 基于游标的分页接口实现
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 爬虫模拟登陆 SegmentFault
  • 手写双向链表LinkedList的几个常用功能
  • 王永庆:技术创新改变教育未来
  • 终端用户监控:真实用户监控还是模拟监控?
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4) PIVOT 和 UPIVOT 的使用
  • (pytorch进阶之路)扩散概率模型
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (转)负载均衡,回话保持,cookie
  • ***详解账号泄露:全球约1亿用户已泄露
  • .form文件_一篇文章学会文件上传
  • .gitattributes 文件
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 指南:抽象化实现的基类
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET导入Excel数据
  • .Net环境下的缓存技术介绍
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET中使用Protobuffer 实现序列化和反序列化
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [100天算法】-实现 strStr()(day 52)
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——