FreeMarker基础知识
freemarker入门
freemarker入门1.什么是FreeMarkerFreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库FreeMarker是免费的而且你还可以通过Eclipse的插件来编辑FreeMarker,经过验证,FreeMarker 最好的Eclipse 编辑插件是 JBoss Tools。
2.FreeMarker特性1、通用目标能够生成各种文本:HTML、XML、RTF、Java源代码等等易于嵌入到你的产品中:轻量级;不需要Servlet环境插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器2、强大的模板语言所有常用的指令:include、if/elseif/else、循环结构在模板中创建和改变变量几乎在任何地方都可以使用复杂表达式来指定值命名的宏,可以具有位置参数和嵌套内容名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换3、通用数据模型FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰4、为Web准备在模板语言中内建处理典型Web相关任务(如HTML转义)的结构能够集成到Model2 Web应用框架中作为JSP的替代支持JSP标记库为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员5、智能的国际化和本地化字符集智能化(内部使用UNICODE)数字格式本地化敏感日期和时间格式本地化敏感非US字符集可以用作标识(如变量名)多种不同语言的相同模板6、强大的XML处理能力<#recurse> 和<#visit>指令(2.3版本)用于递归遍历XML树在模板中清楚和直觉的访问XML对象模型开源论坛 JForum 就是使用了FreeMarker 做为页面模板。
freemarker基本语法
freemarker基本语法一、什么是FreemarkerFreemarker是一个模板引擎,它可以将数据和模板进行结合,生成所需的文本输出。
它主要用于Web应用程序中的MVC架构中,将业务逻辑和表现层分离。
二、Freemarker基本语法1. 变量Freemarker中的变量可以通过${}来表示,如${}表示取出user对象的name属性。
2. 指令指令是Freemarker中最重要的语法之一,它可以控制模板引擎的行为。
常用指令有if、list、assign等。
(1)if指令:用于条件判断,例如:<#if user.age gt 18>成年人<#else>未成年人</#if>```(2)list指令:用于循环输出,例如:```html<#list users as user>${}</#list>```(3)assign指令:用于变量赋值,例如:```html<#assign name = "张三"> ${name}```宏定义是一种自定义函数的方式,在模板中可以多次调用。
例如:```html<#macro printName name>${name}</#macro><@printName name="张三"/><@printName name="李四"/>```4. 内建函数Freemarker提供了一些内建函数,可以方便地处理字符串、日期等数据类型。
例如:(1)字符串函数:```html${name?length} //获取字符串长度${name?upper_case} //将字符串转换为大写字母${name?lower_case} //将字符串转换为小写字母```(2)日期函数:```html${date?string("yyyy-MM-dd")} //将日期格式化为指定格式的字符串${date?time} //获取日期的时间戳```5. 注释在Freemarker中,注释可以使用<#-- -->来表示,例如:```html<#-- 这是一段注释 -->```三、Freemarker在Java中的应用1. 引入Freemarker依赖在Maven项目中,可以通过以下方式引入Freemarker依赖:```xml<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency>```2. 创建Configuration对象Configuration对象是Freemarker的核心类,它会负责解析模板文件和数据模型。
freemarker基础语法
FreeMarker 是一个用Java 语言编写的模板引擎,它是一个用于生成输出文本的通用工具。
其主要应用于Web 开发,能够处理各种复杂的数据结构,并能够与各种数据库进行交互。
FreeMarker 的基础语法主要包括以下几个方面:1. 变量:在FreeMarker 中,你可以用`${...}` 来定义一个变量。
例如,`${name}` 就是一个变量,表示名字。
2. 数据结构:FreeMarker 支持各种复杂的数据结构,包括列表(list)、哈希表(hash table)、方法(method)等。
你可以用`#list`, `#set`, `#if`, `#else`, `#elseif`, `#switch`, `#case`, `#default` 等指令来创建和控制这些数据结构。
3. 函数:你可以用`#function` 定义自己的函数,然后用`#use` 或`#import` 引入其他FreeMarker 模板中定义的函数。
函数可以接受参数,并返回一个值。
4. 指令:FreeMarker 有很多内置的指令,如`#include`(包含其他文件)、`#import`(导入其他文件定义的函数和宏)、`#use`(使用其他文件定义的模板函数)等。
5. 注释和注释块:你可以用`#comment` 来创建注释,用`#end` 来结束注释块。
6. 宏:你可以用`#macro` 来定义一个宏,然后用`#end` 来结束宏定义。
宏可以接受参数,并返回一个值。
7. 自定义指令:你也可以创建自己的指令,用`#defining` 来定义一个全局的自定义指令,用`#end` 来结束指令定义。
自定义指令可以在模板中的任何位置使用。
8. 表达式:FreeMarker 支持各种表达式,包括算术表达式、比较表达式、逻辑表达式、字符串表达式等。
以上就是FreeMarker 的基础语法,更详细的信息可以查阅FreeMarker 的官方文档或相关教程。
FreeMarker基础知识表达式
直接指定值可以是字符串、数值、布尔值、集合及对象.. 字符串直接指定字符串值使用单引号或双引号限定.字符串中可以使用转义字符”\".如果字符串内有大量地特殊字符,则可以在引号地前面加上一个字母,则字符串内地所有字符都将直接输出.. 数值数值可以直接输入,不需要引号.不支持科学计数法.. 布尔值直接使用或,不使用引号.. 集合集合用中括号包括,集合元素之间用逗号分隔.使用数字范围也可以表示一个数字集合,如等同于集合[, , , , ];同样也可以用来表示[, , , , ].. 对象对象使用花括号包括,中地对之间用冒号分隔,多组对之间用逗号分隔.注意:对象地和都是表达式,但必须是字符串.二、输出变量值地表达式输出变量时,这些变量可以是顶层变量,也可以是对象地变量,还可以是集合中地变量,并可以使用点(.)语法来访问对象地属性.. 顶层变量所谓顶层变量就是直接放在数据模型中地值.输出时直接用${}即可.. 输出集合元素可以根据集合元素地索引来输出集合元素,索引用中括号包括.如:输出[“”,“”,“”]这个名为地集合,可以用${[]}来输出第一个数字.还支持用[]来表示原集合地子集合[“”,“”].. 输出元素对于实例,一样把它看作属性为,属性值为地对象.输出对象时,可以使用点语法或中括号语法,如下面地几种写法地效果是一样地:[""][""][""][""]使用点语法时,变量名字有和顶层变量一样地限制,但中括号语法没有任何限制.三、字符串操作. 字符串连接字符串连接有两种语法:()使用${..}或{..}在字符串常量内插入表达式地值;() 直接使用连接运算符“”连接字符串.如,下面两种写法等效:${", ${}"}${", " "!"}有一点需要注意:${..}只能用于文本部分作为插值输出,而不能用于比较等其他用途,如:< ${}>!<>< "${}">!<>应该写成:< >!<> . 截取子串截取子串可以根据字符串地索引来进行,如果指定一个索引值,则取得字符串该索引处地字符;如果指定两个索引值,则截取两个索引中间地字符串子串.如:< "">${[]} < 输出字符>${[]} < 输出子串“” >四、集合连接操作连接集合地运算符为“”五、连接操作连接操作地运算符为“”六、算术运算符表达式中支持“”、“-”、“*”、“”、“”运算符.七、比较运算符表达式中支持地比较运算符有如下几种:. (或者):判断两个值是否相等;. :判断两个值是否不相等;注:和可以用作字符串、数值和日期地比较,但两边地数据类型必须相同.而且地比较是精确比较,不会忽略大小写及空格.. >(或者):大于. >(或者):大于等于. <(或者):小于. <(或者):小于等于注:上面这些比较运算符可以用于数字和日期,但不能用于字符串.大部分时候,使用比>有更好地效果,因为会把>解释成标签地结束字符.可以使用括号来避免这种情况,如:< (>)>.八、逻辑运算符. :逻辑与;. :逻辑或;. !:逻辑非逻辑运算符只能用于布尔值.九、内建函数提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来转换输出变量.字符串相关常用地内建函数:. :对字符串进行编码;. :使字符串第一个字母大写;. :将字符串转成小写;. :将字符串转成大写;集合相关常用地内建函数:. :获得集合中元素地个数;数字值相关常用地内建函数:. :取得数字地整数部分.十、空值处理运算符地变量必须赋值,否则就会抛出异常.而对于来说,值和不存在地变量是完全一样地,因为无法理解值.提供两个运算符来避免空值:. !:指定缺失变量地默认值;. ??:判断变量是否存在.!运算符有两种用法:!或.第一种用法不给变量指定默认值,表明默认值是空字符串、长度为地集合、或长度为地对象.使用!运算符指定默认值并不要求默认值地类型和变量类型相同.??运算符返回布尔值,如:??,如果变量存在,返回,否则返回.。
freemarker的标签语法
freemarker的标签语法一、Freemarker是个啥? 。
咱先来说说Freemarker是个啥玩意儿。
Freemarker呢,就像是一个超级厉害的小助手,专门用来处理模板的。
你可以把它想象成一个魔法盒,你给它一些数据,再给它一个模板,它就能按照这个模板把数据变成超级酷炫的东西,像网页啦、邮件内容啦之类的。
为啥要用Freemarker呢?你想啊,要是你每次做网页或者写邮件都要从头开始写代码,那得多累啊。
有了Freemarker,你就可以把那些经常用到的部分做成模板,然后只要把不同的数据塞进去就好了,就像搭积木一样简单又有趣。
二、基本标签语法来咯 。
(一)插值表达式。
这可是Freemarker的基础操作哦。
插值表达式就像一个小嘴巴,它会把数据“说”出来。
在Freemarker里,插值表达式的格式是`{变量名}`。
比如说,你有一个变量叫`userName`,里面存着用户的名字,那你在模板里写 `{userName}`,Freemarker就会把这个变量的值显示出来。
是不是很神奇呢?就像你告诉它一个小秘密,然后它就会把这个秘密展示给大家看。
(二)指令标签。
1. if指令。
这个 `if` 指令就和我们在编程里常见的 `if` 语句差不多啦。
比如说,你想根据用户的年龄来显示不同的内容。
你可以这样写:<#if age > 18>.欢迎,你已经成年啦!<#else>.小宝贝,你还未成年呢。
</#if>.这里的 `age` 就是我们的变量,根据它的值,Freemarker就会决定显示哪一段内容。
这就像是Freemarker在做选择题一样,根据不同的情况选择不同的答案。
2. list指令。
当你有一组数据,比如说一个用户的购物清单,你就可以用 `list` 指令来遍历它。
像这样:<#list shoppingList as item>.- {item}这里的 `shoppingList` 是一个列表类型的变量,`item` 呢,就是每次遍历出来的一个元素。
FreeMarker基础语法,宏,引用等
FreeMarker基础语法,宏,引⽤等FreeMarker的插值有如下两种类型:1,通⽤插值${expr};2,数字格式化插值:#{expr}或#{expr;format}${?if_exists } //⽤于判断如果存在,就输出这个值${?default(‘xxx’)}//默认值xxx${!"xxx"}//默认值xxx${book.date?string('yyyy-MM-dd')} //⽇期格式${book?string.number} 20 //三种不同的数字格式${book?string.currency}--<#-- $20.00 -->${book?string.percent}—<#-- 20% --><#assign foo=ture /> //声明变量,插⼊布尔值进⾏显⽰${foo?string("yes","no")} <#-- yes -->⼤⼩⽐较符号使⽤需要注意:(xml的原因),可以⽤于⽐较数字和⽇期使⽤lt、lte、gt和gte来替代<、<=、>和>= 也可以使⽤括号<#if (x>y)>内置函数: 调⽤区别于属性的访问,使⽤?代替.常见的⼀些内置函数对于字符串html-对字符串进⾏HTML编码cap_first-使字符串第⼀个字母⼤写lower_case-将字符串转换成⼩写trim-去掉字符串前后的空⽩字符⽰例:${“freeMarker”?cap_first}对于Sequences(序列)size-获得序列中元素的数⽬对于数字int-取得数字的整数部分(如-1.9?int的结果是-1)对于集合,可以使⽤数组的⽅式,使⽤下标索引进⾏访问逻辑判断:if................<#if condition>...<#elseif condition2>...<#elseif condition3>......<#else>...Boolean类型的空值判断空值判断可以写成<#if ?? > //注意${}为变量的渲染显⽰,⽽<>为定义等操作符的定义switch............<#switch value><#case refValue1>...<#break><#case refValue2>...<#break>...<#case refValueN>...<#break><#default>...</#switch>快速定义int区间的集合<#assign l=0..100/> //注意不需要[]3:循环读取集合: 注意/的使⽤<#list student as stu>${stu}<br/></#list>与jstl循环类似,也可以访问循环的状态item_index:当前变量的索引值item_has_next:是否存在下⼀个对象其中item名称为as后的变量名,如stu集合长度判断<#if student?size != 0></#if> 判断=的时候,注意只要⼀个=符号,⽽不是==宏/模板初步了解:使⽤更像⼀个闭包closure,可以定义后,在脚本中任意地⽅引⽤,并原地起作⽤<#macro greet><font size="+2">Hello Joe!</font></#macro>使⽤的⽅式为:<@greet></@greet> //同xml可以简写成<@greet/>宏的参数定义,类似js,在宏名后带参数进⾏传递定义<#macro greet person color>${person}</#macro>调⽤带参数时,注意使⽤类似XML的属性格式进⾏传递,不需要关⼼顺序问题<@greet person="Fred" color="black"/>参数默认值定义,如果没有,就必须要求传递完整的参数列表<#macro greet person color="black"><font size="+2" color="${color}">Hello ${person}!</font></#macro>使⽤xml的嵌套内容进⾏传递宏调⽤,关键标签 <#nested><#macro border><table border=4 cellspacing=0 cellpadding=4><tr><td><#nested></tr></td></table></#macro>调⽤时:<@border>The bordered text</@border><#nested> 标签可以在宏中多次调⽤,也可以将多个宏组合进⾏嵌套引申详解 nested在宏⾥嵌套内容FreeMarker的宏可以有嵌套内容,<#nested>指令会执⾏宏调⽤指令开始和结束标记之间的模板⽚断,举⼀个简单的例⼦:<#macro border><table border=4 cellspacing=0 cellpadding=4><tr><td><#nested></tr></td></table></#macro>执⾏宏调⽤:<@border>The bordered text</@border>输出结果:<table border=4 cellspacing=0 cellpadding=4><tr><td>The bordered text</tr></td></table><#nested>指令可以被多次调⽤,每次都会执⾏相同的内容。
FreeMarker学习笔记
FreeMarker学习笔记1. 模板+数据模型=输出2. 数据模型a) 类似目录的变量称为hashes,包含保存下级变量的唯一的查询名字,充当其它对象的容器,每个都关联唯一的查询名字b) 类似文件的变量称为scalars,保存单值,有两种类型i. 字符串:用引号括起,单引号or双引号ii. 数字:不用引号iii. 日期:可以是日期,时间或日期-时间iv. 布尔值:true或false,通常在<#if …>标记中使用v. 对scalars的访问从root开始,各部分用”.”分隔,如animals.mouse.pricec) 另外一种变量是sequences,和hashes类似,充当其它对象的容器,按次序访问,只是不使用变量名字,而使用数字索引,如animals[0].name,索引值从0开始d) 通常每个变量具有上述的一种能力,但一个变量可以具有多种上述能力e) 方法i. ${avg(3,5,20)} ${avg(student.zhangyaang.age,student.situ.age)}f) 宏和变换器:用户自定义的指令(FTL标记)g) 节点:树形结构中的一个节点,常用于xml处理中3. 模板a) 文本:直接输出b) ${…}:称为interpolations,FreeMarker会在输出时用实际值代替,或#{},只用于文本中c) FTL标记:类似于HTML,为了与HTML区分,用#开始,有的以@开始,不会输出,区分大小写,FTL标记不能位于另一个FTL标记内部d) 注释:<#--和-->,不会输出e) 多余的空白字符会在模板输出时移除f) 指令i. 使用FTL标记引用指令,有三种FTL标记1. 开始标记:<#name prarm>2. 结束标记:</#name>3. 空内容指令标记:<#name param />ii. 有两种类型的指令:预定义指令和用户定义指令,用户定义指令要用@替换#iii. FTL标记不能够交叉,应该正确嵌套iv. 如果使用不存在的指令,FreeMarker会产生错误消息v. < , </ 和指令间不允许有空白字符g) 表达式i. 字符串1. 使用单引号或双引号限定2. 特殊字符要转义3. raw字符串,可以认为是文本,其中的$和{等不具有特殊含义,该类字符串在引号前面加r,如${r”${foo}”} ${r”c:\foo\bar”} ii. 数字1. 直接输入,不需要引号2. 精度数字使用”.”分隔,不能使用分组符号3. 不支持科学计数法4. 不能省略小数点前面的05. 数字8 ,+8 ,08和8.00 都是相同的iii. 布尔值:true 和 false, 不使用引号iv. 序列1. 有逗号分隔的子变量列表,有方括号限定,如:<#list [“winter”, ”spring”, ”summer”, ”autumn”] as x> ${x}</#list>2. 列表的项目是表达式,如:[2+2, [1,2,3,4], ”whatnot”]3. 可以使用数字范围定义数字序列,如:2..5等同于[2,3,4,5] 注意:数字范围没有方括号如:5..24. 散列(hash) 由逗号的键/值列表,有大括号限定,键和值之间用冒号分隔{“name”:”zhangyang”,”age”:23} 键和值都是表达式,但键必须是字符串v. 获取变量1. 顶层变量:${variable}, 变量名只能是字母, 数字, 下划线, $, @ 和# 的组合, 不能以数字开头2. 从散列中获取数据a) b) school.[“student”].namec) school[“student”][“name”]说明:使用点语法,变量名有顶层变量一样的限制, 方括号语法没有该限制3. 从序列获(sequences)得数据: 和散列的方括号语法一样, 只是方括号的表达式值必须是数字; 注意: 第一个项目的索引是04. 序列片段: 使用[startIndex..endIndex]语法, 从序列中获得片段(也是序列)5. 特殊变量: FreeMarker内定义的变量, 使用 .variablenae 语法访问vi. 字符串操作1. Interpolation(或连接操作)a) 可以使用${..} 或#{..} 在文本部分插入表达式的值,如${“Hello ${user}”} 等于${“Hello”+user}b) ${..} 只能用于文本部分, 不用于FTL表达式中2. 子串假设user的值为”tom cat”${user[0]}${user[4]} ? tc${user[1..4]} ? om cvii. 序列操作连接操作: 和字符串一样, 用”+”<#list [“joe”,”fred”] + [“julia”,”kate”] as user>${user}</#list>viii. 散列操作连接操作: 和字符串一样, 用”+”, 如果有相同的key, 右边的值替换左边的值(后面的替换前面的), 如<#assign ages = {“joe”:23,”fred”:25} + {“joe”:30,”julia”:23}></#assign> 结果: joe的值为30ix. 算术运算1. +, -- , *, /, %${x / 2}2. 操作符两边必须是数字3. 使用“+” 操作符时,如果一边是数字, 一边是字符串, 就会自动将数字转换为字符串, 如: ${3+”4”} 结果 344. 使用内建的 int 获得整数部分${1.1?int} ?1${1.999?int} ?1${(5/2)?int} ?25. 比较操作符a) 使用=(或==,完全相等)测试两个值是否相等, 使用!=测试两个值是否不相等b) = 和!= 两边必须是相同类型的值c) FreeMarker是精确比较,”x”,”x “和”x”是不等的d) 对数字和日期可以使用<, <=, >, 和>=, 但不用用于字符串e) 由于FreeMarker 会将>解释成FTL标记的结束字符, 所以对于>和>=可以使用括号来避免这种情况, 如<#if (x > y)>f) e)的一种替代方法, 使用lt, lte, gt 和gte来替代6. 逻辑操作符a) &&(and), ||(or), !(not), 只能用于布尔值<#if x < 13 && color = “green”>…</#if><#if ! man>woman</#if>7. 内建函数a) 内建函数的用法类似访问散列的子变量, 只是用”?”|替代”,”b) 用于字符串i. html: 对字符串进行html编码ii. cap_first: 将字符串转换成第一个字母大写iii. lower_case: 小写iv. upper_case: 大写v. trim: 去掉字符串前后的空白字符c) 用于序列i. size: 获得序列中元素的数目d) 用于数字i. int: 取得数字的整数部分e) 例子:test = “tom & jerry”${test?html} ? tom & jerry${test?upper_case?html} ? TOM & JERRY8. 操作符优先顺序h) Interpolation(只用于文本部分)i. Interpolation有两种类型1. 通用Interpolation: ${expr}a) 插入字符串值: 直接输出表达式结果b) 插入数字值: 根据缺省格式(由#setting指令设置)将表达式转换成文本输出; 可以使用内建函数string格式化单个Interpolationc) 例子<#setting number_format=”currency”/> ?金额<#assign answer=43/>${answer} ? $43.00${answer?string} ?$43.00${answer?string.number} ?43${answer?string.currency} ?$43.00${answer?string.percent} ?4,300%2. 数字Interpolation: ${expr} 或#{expr ; format}3. 插入日期: 根据缺省格式(#setting) 将表达式结果转换成文本输出; 可以使用内建的函数string 格式化单个Interpolation, 例子: ${update?string(“yyyy-MM-dd HH:mm:ss zzzz”)}4. 插入布尔值: 说明同上<#assign foo = true/>${foo?st ring(“yes”,”no”)} ?yes5. 数字Interpolation的#{expr ; format}形式可以用来格式化数字, format可以是a) mX: 小数部分最小X位b) MX: 小数部分最大X位c) 例子<#assign x=2.364/><#assign y=4/>#{x; M2} ?2.36#{y; M2} ?4#{x; m1} ?2.4#{y; m1} ?4.0i) 例子i. if指令<#if zhangyang.age < situ.age>Situ is order<#else>Zhangyang is order</#if>ii. list指令 <#list students[0..5] as s_list></#list>取list的前5条记录<table border = “1”><tr><td>name</td><td>age</td><#list students as s_list><td>${s_}</td><td>${s_list.age}</td></#list></tr></table>iii. include指令<#include “/all/header.html”>…<#include “/all/footer.html”>iv. 应用<table><#list students as s_list><tr><td><#if s_list.sex =”man”><img src=”/img/boy.gif”/><#else><img src=”/img/girl.gif/></#if>${s_}</td><td>${s_list.age}</td></tr></#list></table>4. 用户自定义指令a) 宏和变换器b) 模板中定义变量c) 名字空间(命名空间)5. 应用a) Listi. 例子1List scalarList = new ArrayList(); scalarList.add("red"); scalarList.add("green"); scalarList.add("blue"); scalarList.add("yellow"); root.put("scList", scalarList);<#list scList as the_value> Scalar List值:${the_value}</#list>ii. 例子2public class User {private String userId;private String userName;}User u1 = new User();u1.setUserId("100");u1.setUserName("郜司徒");User u2 = new User();u2.setUserId("200");u2.setUserName("张宇伟");User u3 = new User();u3.setUserId("300");u3.setUserName("冯钰凯");User u4 = new User();u4.setUserId("400");u4.setUserName("苗先杰");SimpleSequence userList = new SimpleSequence(ObjectWrapper.BEANS_WRAPPER);userList.add(u1);userList.add(u2);userList.add(u3);userList.add(u4);root.put("userList", userList);<#list userList as list>List对象user的值:${erId}List的value:${erName}</#list>b) Mapi. 例子1SimpleHash scalarMap = new SimpleHash(ObjectWrapper.BEANS_WRAPPER);scalarMap.put("anotherString", "aaaaaaaa");scalarMap.put("anotherNumber", new Double(2.5555));root.put("scMap", scalarMap);<#list scMap?keys as myKey>Map key is:${myKey}map value is:${scMap[myKey]}</#list>ii. 例子2SimpleHash userMap = new SimpleHash(ObjectWrapper.BEANS_WRAPPER);userMap.put("1", u1);userMap.put("2", u2);userMap.put("3", u3);userMap.put("4", u4);root.put("user", userMap);<#list user?keys as key1>${key1}${user[key1].userId}${user[key1].userName}<#assign u = "${user[key1]}">User is :${u}</#list>c) List和MapSimpleHash root = new SimpleHash(/*ObjectWrapper.BEANS_WRAPPER*/);// Map<String,String> my_map = new HashMap<String,String>();SimpleHash my_map = new SimpleHash();my_map.put("1", "ehow");my_map.put("2", "laomiao");my_map.put("3", "yukai");my_map.put("zt", "北京中天诺士达");SimpleHash my_map2 = new SimpleHash();my_map2.put("1", "ehow2");my_map2.put("2", "laomiao2");my_map2.put("3", "yukai2");my_map2.put("zt", "北京中天诺士达2");SimpleHash my_map3 = new SimpleHash();my_map3.put("1", "ehow3");my_map3.put("2", "laomiao3");my_map3.put("3", "yukai3");my_map3.put("zt", "北京中天诺士达3");SimpleHash my_map4 = new SimpleHash();my_map4.put("1", "ehow4");my_map4.put("2", "laomiao4");my_map4.put("3", "yukai4");my_map4.put("zt", "北京中天诺士达4");// List<Map> userList = new ArrayList<Map>();SimpleSequence userList=new SimpleSequence(/*ObjectWrapper.BEANS_WRAPPER*/);userList.add(my_map);userList.add(my_map2);userList.add(my_map3);SimpleSequence userList2 = new SimpleSequence();userList2.add(my_map4);userList2.add(my_map4);userList2.add(my_map4);root.put("the_list", userList);root.put("other_list", userList2);<div id="Layer1"><table border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#FF0000"><tr><td width="100" height="30" align="center" bgcolor="#FFFFFF">代号</td><td width="100" align="center" bgcolor="#FFFFFF">代号2</td><td width="100" align="center" bgcolor="#FFFFFF">代号3</td><td width="405" height="30" align="center" bgcolor="#FFFFFF">明细</td></tr><#list the_list as list><tr><td width="100" height="30" align="center" bgcolor="#FFFFFF">${list["1"]}</td><td width="100" align="center" bgcolor="#FFFFFF">${list["2"]}</td><td width="100" align="center"bgcolor="#FFFFFF">${list["3"]}</td><td height="30" align="center" bgcolor="#FFFFFF">${list.zt}</td></tr></#list><#list other_list as list2><tr><td width="100" height="30" align="center" bgcolor="#FFFFFF">${list2["1"]}</td><td width="100" align="center" bgcolor="#FFFFFF">${list2["2"]}</td><td width="100" align="center" bgcolor="#FFFFFF">${list2["3"]}</td><td height="30" align="center" bgcolor="#FFFFFF">${list2["zt"]}</td></tr></#list></table></div>d) 与Hibernate结合DAOString hql = "select new map(s.s_name as s_n,s.s_addr as s_a,h.h_addr as h_a,u.u_name as u_n) from User_school as s,User_home as h,User_info as u where u.id=h.id and h.id=s.id";// String hql = "select new map(s.s_name as s_n,s.s_addr as s_a) from User_school as s";List my = session.createQuery(hql).list();Hello hello = new Hello();hello.sayHello(my);通用方法public void sayHello(List info){...root.put("from_db", info);...}FTL<#list from_db as db>${db.s_n}${db.s_a}${db.h_a}${db.u_n}</#list>e) 我们的项目<#assign n = list5?size /> //定义n的值为list5的大小<#if n gt 6> //如果n大于6,页面中可能要求只显示6条<#assign n = 6 /> //把n重定义为6</#if><#if n!=0> //防止n的值为0,也可以写成<#if n gt 0 ><#list 0..(n-1) as i> //把前 n 条记录赋值给 i,如果i=3,则[0,1,2] <#assign ls5 = list5[i] /> //把list5的第i个元素赋值给ls5<#assign isNew = list5Istrue[i] /><tr><td height='25' class='z3'>.<a href='#' onclick="zw('${ls5.CIid}','905','活动展示','');"><#if ls5.CTitle?length lt 15> //如果Ctitle的长度小于15,就${ls5.CTitle} //就正常显示该标题<#else> //如果大于15${ls5.CTitle[0..15]}... //就截取前15个,并加上…</#if><#if isNew="true"><img src='/model/img/new-111.gif' width='27' height='11' border='0' /></#if></a></td></tr></#list></#if>。
freemarker语法
freemarker语法freemarker是一种模板引擎,它可以将结构化的数据与静态文字文件混合,然后生成HTML页面、XML文档、电子邮件,以及其他格式的文档。
它拥有许多功能,例如强大的if和for指令,Data Model,各种变量,文件包含,数据类型及函数等,能够为开发者们节省大量时间。
本文将会介绍 freemarker法基础、常用语法特性和数据访问等。
一、 freemarker语法基础1.用变量: freemarker 使用 ${...} 式来引用变量,例如:${name} 用 name量。
2.释: freemarker支持两种注释方式,持行注释 (# ...)行注释(<#-- --#>)。
3.件语句: freemarker 使用 <#if condition> ....</#if>式表示条件语句,当条件为true时,紧跟condition之后的元素才会被执行。
4.环语句: freemarker 使用 <#list sequence as item> ... </#list>式表示循环语句, sequence以是数组,字符串,数字或者对象。
二、freemarker语法特性1.算符: freemarker持 +,-, *,/,%,==,!=,>,>=, <=, ??,and,or,not运算符。
2.较: freemarker持比较操作,用比较操作可以产生true或者false,:${age > 10}3.符串操作: freemarker持各种字符串操作,括string.length(), string.substring(), string.contains()等。
4.数: freemarker持很多内置函数,例如date.format(dateObj), date.time?, number.format(numberValue)。
freemarker菜鸟教程
freemarker菜鸟教程Freemarker菜鸟教程1. 介绍Freemarker是一种模板引擎,用于将数据模型与文本模板合并生成输出内容。
它提供了多种功能,使开发人员能够轻松地生成动态网页、邮件、XML文件等。
2. Freemarker的优点- 简洁易学:Freemarker使用简单的语法和模板指令,易于学习和使用。
即使是没有编程经验的初学者也可以快速上手。
- 强大灵活:Freemarker提供了丰富的模板指令和表达式,可以满足各种动态内容生成的需求。
- 高性能:Freemarker运行速度快,生成的输出内容效率高,非常适合用于大规模的数据处理和生成。
3. Freemarker基本语法- 插值:使用${}来插入变量或表达式的值。
```html<p>欢迎来到Freemarker教程,${username}!</p>```- 条件判断:使用if-else指令进行条件判断。
```html<#if age < 18><p>您是未成年人。
</p><#else><p>您已成年。
</p></#if>```- 循环:使用list指令实现列表的循环遍历。
```html<ul><#list users as user><li>${}</li></#list></ul>```- 宏定义:使用#macro指令定义宏,可以实现代码的重复使用。
```html<#macro hello /><h1>Hello, ${name}!</h1></#macro>```4. Freemarker内置指令- include指令:用于引入其他模板文件。
```html<#include \。
freemarker
If指令
• 使用if指令可以有条件地跳过模板的一部分,这和程序语 言中if是相似的。 • 格式:
<#if condition> ... <#elseif condition2> ... <#elseif condition3> ... ... <#else> ... </#if> 这里: condition,condition2等:表达式将被计算成个部分中的一个序列中包含的各个 变量 • 格式:
<#list sequence as item> ... </#list> 这里: sequence:表达式将被算作序列或集合 item:循环变量(不是表达式)的名称
include指令
• 模板中插入另外一个FreeMarker模板文件(由path参数指 定)。被包含模板的输出格式是在include标签出现的位置 插入的 • 格式:
<#include path> or <#include path options> path:要包含文件的路径;一个算作是字符串的表达式。(用其他 话说,它不用是一个固定的字符串,它也可以是像profile.baseDir + “/menu.ftl”这样的东西。) options:一个或多个这样的选项:encoding=encoding,parse=parse encoding:算作是字符串的表达式 parse:算作是布尔值的表达式(为了向下兼容,也接受一部分字 符串值)
– 标量存储单一的值,这种类型的值可以是字符串,数字,日期/时 间或者是布尔值。 – 哈希表是存储变量和与其相关且有唯一标识名称变量的容器。 序 列是存储有序变量的容器。 – 存储的变量可以通过数字索引来检索,索引通常从零开始。
freemarker - 基础知识
Freemarker模板+ 数据模型= 输出一、注释:包含在<#--和-->(而不是<!--和-->)之间。
二、F TL标记FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记区分,用#开始(有些以@开始,在后面叙述)。
如下:<#if abc=”abc”>abc</#if>或者[#if abc=”abc”]abc[/#if]注意:一个模板内容只能一种标记,即尖括号(<>)和中括号([])不能同时使用。
三、${…}${…}:称为interpolations,FreeMarker会在输出时用实际值进行替代。
四、基本常识●FTL区分大小写所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的。
●FTL标记不能够交叉,而应该正确的嵌套如下面的代码是错误的:<ul><#list animals as being><li>${} for ${being.price} Euros<#if use = "Big Joe">(except for you)</#list></#if> <#-- WRONG! --></ul>●如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息。
为了避免这样的错,可使用默认值,有两种方法,如下:${user?default("123")}${user!"123"}●如果要输出bean.createTime时间,并且格式是“yyyy-MM-dd”。
${bean.beginDate?string('yyyy-MM-dd')}//如果空值的话会报错!//如何判断如果为空则不输出,如果不为空输出'yyyy-MM-dd'格式●判断存在与否exists[#list list as teacher][#if teacher.sex?exists && teacher.sex>50]姓名:${} 是老人家<br/>[/#if][/#list]●FreeMarker会忽略FTL标记中的空白字符●< 、</ 和指令之间不允许有空白字符< #if> <#-- WRONG! --></ #if> <#-- WRONG! -->五、指令格式●FTL标记有两种格式,这和HTML标记是类似的:⏹开始标记:<#directivename parameters> 结束标记:</#directivename>⏹空内容指令标记:<#directivename parameters/>●预定义指令和用户定义指令预定义指令用#,用户定义指令用@六、预定义指令●if指令●list指令<p>We have these animals:<table border=1><tr><th>Name<th>Price<#list animals as being><tr><td>${}<td>${being.price} Euros</#list></table>输出为:<p>We have these animals:<table border=1><tr><th>Name<th>Price<tr><td>mouse<td>50 Euros<tr><td>elephant<td>5000 Euros<tr><td>python<td>4999 Euros</table>●include指令七、用户定义指令用户定义指令要使用@替换#,如<@mydirective>...</@mydirective>。
Freemarker的基本语法及入门基础
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} </font><br>int获取:<font color="red"> ${intVar} </font><br>boolean获取:<font color="red"> ${booVar?string("yes","no")} </font>展⽰结果:String获取:世界你好int获取:10boolean获取:yes(2)${var!}适⽤类型:对 null 或者不存在的对象进⾏取值,可以设置默认值,例:${var!'我是默认值'} 即,有值时显⽰正常值,⽆值时⽰例:在后台⽂件中定义变量String strVar = "世界你好";String str = null;在页⾯中获取变量:String获取:<font color="red"> ${strVar!"我是空"} </font><br>str获取:<font color="red"> ${str!} </font><br>str获取:<font color="red"> ${str!"默认"} </font><br>展⽰结果:String获取:世界你好str获取:str获取:默认(3)${封装对象.属性}适⽤类型:对封装对象进⾏取值,例:${}⽰例:在后台⽂件中封装对象User[ name, age ]String name = "姓名";int age = 18;在页⾯中获取变量:name获取:<font color="red"> ${} </font><br>age获取:<font color="red"> ${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')} </font><br>time获取:<font color="red"> ${date?string('HH:mm:ss')} </font><br>datetime获取:<font color="red"> ${date?string('yyyy-MM-dd HH: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>");在页⾯中获取变量:⾮转义获取:<font color="red"> ${m.model} </font><br>转义获取: ${m.model?html} </font><br>展⽰结果:⾮转义获取:我只是个菜单转义获取:<font color = 'red'>我只是个菜单</font>(6)<#assign num = 100 />适⽤类型:定义变量,⽀持计算和赋值⽰例:在页⾯中定义变量:<#assign num = 100 />num获取:<font color="red"> ${num)} </font><br>计算结果:<font color="red"> ${num * 10} </font><br>展⽰结果:num获取:100计算结果:1000(7)对List集合进⾏取值<#list list集合 as item>${item} --取值</#list>⽰例:List<String> strList = new ArrayList<String>();strList.add("第⼀个值");strList.add("第⼆个值");strList.add("第三个值");在页⾯中获取变量:<#list strList as item>${item!}<br/> --取值</#list>展⽰结果:第⼀个值第⼆个值第三个值(8)对Map集合进⾏取值<#list map?keys as 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>${key}:${m[key]}</#list>展⽰结果:name:姓名age:18sex:男2. 条件判断指令:(1) if格式:<#if 条件>输出</#if>⽰例:在页⾯中定义变量并判断条件:<#assign age = 18 /><br><#if age == 18><font color="red"> age = 18</font></#if>展⽰结果:age = 18(2) if - else格式:<#if 条件>输出<#else>输出</#if>⽰例:在页⾯中定义变量并判断条件:<#assign age = 20 /><br><#if age == 18><font color="red"> age = 18</font><#else><font color="red"> age != 18</font></#if>展⽰结果:age != 18(3) if - elseif - else格式:<#if 条件1>输出<#elseif 条件2>输出<#else>输出</#if>在页⾯中定义变量并判断条件:<#assign age = 20 /><br><#if age > 18><font color="red">青年</font><#elseif age == 18><font color="red"> 成年</font><#else><font color="red"> 少年</font></#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 去两端空格处理数字:stringx?string("0.##") 变成⼩数点后⼏位round 四舍五⼊floor 去掉⼩数点ceiling 近1 变成整数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>。
Freemarker基础入门
简介:最简单的模板是普通HTML 文件(或者是其他任何文本文件—FreeMarker本身不属于HTML)。
当客户端访问页面时,FreeMarker 要发送HTML 代码至客户端浏览器端显示。
如果想要页面动起来,就要在HTML 中放置能被FreeMarker所解析的特殊部分。
${…}:FreeMarker将会输出真实的值来替换花括号内的表达式,这样被称为interpolations 插值,可以参考第上面一个示例的内容。
FTL tags 标签(FreeMarker模板的语言标签):FTL 标签和HTML 标签有一点相似,但是它们是FreeMarker的指令而且是不会直接输出出来的东西。
这些标签的使用一般以符号#开头。
(用户自定义的FTL 标签使用@符号来代替#,但这是更高级的主题了,后面会详细讨论)。
Comments 注释:FreeMarker的注释和HTML 的注释相似,但是它用<#--和-->来分隔。
任何介于这两个分隔符(包含分隔符本身)之间内容会被FreeMarker忽略,就不会输出出来了。
其他任何不是FTL 标签,插值或注释的内容将被视为静态文本,这些东西就不会被FreeMarker所解析,会被按照原样输出出来。
directives 指令就是所指的FTL 标签。
这些指令在HTML 的标签(如<table>和</table>)元素(如table 元素)中的关系是相同的。
(如果现在你还不能区分它们,把“FTL 标签”和“指令”看做是同义词即可。
)三大指令1.if指令<#if condition>...<#elseif condition2>...<#elseif condition3>......<#else>...其中空值判断可以写成<#if ?? ></#if>2.list指令遍历集合中的数据:<#list sequence as item>...</#list><#list>空值判断<#if bookList?size = 0></#list>例子:<#list employees.part1 as e>${}<#if e_has_next>集合还有数据,不是最后一个!<#else>已经没有数据了!<#/if></#list>3. include指令include 指令,我们可以插入其他文件的内容到当前的模板中。
FreeMarker模板文件的组成及基本语法详解
</#list>
输出结果是:
星期一
星期二
星期三
星期四
星期五
星期六
星期天
除此之外,集合元素也可以是表达式,例子如下:
[2 + 2, [1, 2, 3, 4], "whatnot"]
还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2
1,开始标签:<#directivename parameter>
2,结束标签:</#directivename>
3,空标签:<#directivename parameter/>
实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.
${foo?string("yes", "no")}
输出结果是:
yes
2.2 数字格式化插值
数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
如下面的例子:
<#assign x=2.582/>
<#assign y=4/>
使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象.
1,字符串
直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子:
Freemarker详解
Freemarker详解A概念最常用的概念1、 scalars:存储单值字符串:简单文本由单或双引号括起来。
数字:直接使用数值。
日期:通常从数据模型获得布尔值:true或false,通常在<#if …>标记中使用2、 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字具有一个唯一的查询名字和他包含的每个变量相关联。
3、 sequences:充当其它对象的容器,按次序访问使用数字和他包含的每个变量相关联。
索引值从0开始。
4、集合变量:除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由<#list...>指令使用的受限sequences。
5、方法:通过传递的参数进行计算,以新对象返回结果方法变量通常是基于给出的参数计算值在数据模型中定义。
6、用户自定义FTL指令:宏和变换器7、节点节点变量表示为树型结构中的一个节点,通常在XML处理中使用。
在模板里对sequences和hashes初始化sequences1. [“you”,”me”,”he”]2. 1..1003. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”}, {“Bkey”:”Bvalue”}, {“Bkey1”:”Bvalue1”}, ] hashes {“you”:”a”,”me”:”b”,”he”:”c”}注释标志<#--这里是注释-->旧版本的freemarker采用的是<#comment> 注释 </#comment>方法sequences内置方法sequence?first返回sequence的第一个值;前提条件sequence不能是nullsequence?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按进行排序hashes内置方法hash?keys返回hash里的所有keys, 返回结果类型sequencehash?values返回hash里的所有value, 返回结果类型sequence模板使用FTL(freeMarker模板语言)编写组成部分一、整体结构1、注释:<#--注释内容-->,不会输出。
freemarker处理表格
一、概述在现代的软件开发中,经常会涉及到对表格数据的处理和展示。
而对于 Java 开发者来说,Freemarker 是一个非常常用的模板引擎,它不仅可以帮助我们动态地生成 HTML 页面,还可以对表格数据进行处理和展示。
本文将介绍如何使用 Freemarker 处理表格数据,包括数据的填充、样式的调整以及动态展示。
二、Freemarker 简介1. Freemarker 是什么Freemarker 是一个基于模板的 Java 程序模板引擎,它可以生成文本输出(HTML网页、电流信箱、配置文件、源代码等),基于模板填充。
它的主要功能包括:- 填充模板数据- 控制、过滤和格式化模板输出- 在输出中引用其他模板- 提供强大的条件和循环处理2. Freemarker 的优势相较于传统的 JSP 或者 Velocity 等模板引擎,Freemarker 具有以下优势:- 语法简单易懂- 支持强大的条件和循环处理- 数据模型灵活- 完全基于模板,不会混淆 Java 代码和模板三、Freemarker 处理表格数据1. 数据填充在使用Freemarker 处理表格数据时,首先需要准备好要填充的数据。
通常情况下,可以将表格数据封装为一个列表对象,然后传入模板进行填充。
```javaList<Map<String, Object>> tableData = new ArrayList<>();Map<String, Object> row1 = new HashMap<>();row1.put("name", "张三");row1.put("age", 25);row1.put("gender", "男");tableData.add(row1);Map<String, Object> row2 = new HashMap<>();row2.put("name", "李四");row2.put("age", 28);row2.put("gender", "女");tableData.add(row2);Map<String, Object> root = new HashMap<>();root.put("tableData", tableData);在模板中,可以通过遍历数据填充表格内容:```html<table><thead><tr><th>尊称</th><th>芳龄</th><th>性别</th></tr></thead><tbody><#list tableData as data><tr><td>${}</td><td>${data.age}</td><td>${data.gender}</td></tr></#list></tbody></table>2. 样式调整在处理表格数据时,经常需要对表格的样式进行调整,以使表格更加美观、易读。
FreeMarker笔记
2.FreeMarker与容器无关,因为它并不知道HTTP或Servlet,也可以在FreeMarker模板中使用JSP标记库 //支持JSP标记库
#{a;M2} //输出2.58
#{a;m2} //输出2.58
#{b;m2} //输出4.00
#{a;m1M2} //输出2.58
#{b;m1M2} //输出4.0
4.ftl中的控制结构:
(1).<#if>、<#else>/<#else if>、</#if>
12.setting指令:用来设置ftl使用的环境,如:<#setting locale="en_US">
13.ftl中的宏:宏相当于程序中的函数,可以传参,可以调用宏以执行宏体内的内容,在那里调用宏宏体中的内容就相当于写在那里。以便在模板中通过用户定义指令使用该变量
(1).宏的定义:用macro指令定义,如:<#macro 宏名 [宏的输入参数名 ...(可选)]>Hello Joe!</#macro> //创建时可带多个参数,可在定义时指定参数的缺省值,否则在调用宏
<#import "/lib/common.ftl" as com> //此处将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中
11.include指令:用于包含指定页面(类似JSP的包含指令,如:<#include "/common/copyright.ftl" encoding="GBK">)
freemarker 用法
freemarker 用法Freemarker 是一种模板引擎,广泛用于JavaWeb 开发中。
它提供了一种将数据模型与视图层分离的方式。
在使用Freemarker 进行开发时,我们首先需要了解一些基本的用法和语法规则。
本文将一步一步回答关于Freemarker 的常见问题,并介绍它的基本用法与功能。
一、什么是Freemarker?Freemarker 是一个模板引擎,它能够根据模板以及给定的数据模型生成最终的文本输出。
它使用简单明了的标记语言,允许开发者通过填充数据模型来动态生成页面内容。
二、如何引入Freemarker?要使用Freemarker,我们首先需要引入它的依赖。
通常情况下,我们可以在Maven 项目的pom.xml 文件中添加以下依赖:xml<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.27-incubating</version></dependency>三、如何配置Freemarker?在Spring Boot 项目中,我们可以使用`@Configuration` 注解来配置Freemarker。
通过`FreeMarkerConfigurer` 类,我们可以设置Freemarker 的一些参数,例如模板文件所在的路径、编码方式等。
java@Configurationpublic class FreemarkerConfig {@Beanpublic FreeMarkerConfigurer freeMarkerConfigurer() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();configurer.setTemplateLoaderPath("classpath:/templates");configurer.setDefaultEncoding("UTF-8");return configurer;}}在上述代码中,我们设置了模板所在的路径为classpath:/templates,这意味着我们的模板文件将在项目resources 目录下的templates 文件夹中。
freemarker语法及应用
freemarker语法及应用Freemarker是一种基于模板的开源Java模板引擎,用于生成动态内容,如HTML网页,电子邮件等。
它的语法简洁且功能强大,可以灵活地处理各种数据类型和逻辑判断。
以下是Freemarker的一些基本语法及应用:1. 变量插值:使用`${variable}`或`#{variable}`语法进行变量的插值。
例如:`${}`会将`user`对象中的`name`属性的值插入到模板中。
2. 判断语句:使用`<#if condition>`和`</#if>`语句来进行条件判断。
可以使用`<#elseif>`和`<#else>`来添加多个条件分支。
例如:```<#if user.age > 18><p>Welcome, ${}. You are an adult.</p><#else><p>Welcome, ${}. You are a minor.</p></#if>```3. 循环语句:使用`<#list>`语句来进行循环迭代。
例如:```<ul><#list users as user><li>${}</li></#list></ul>```4. 宏定义:使用`<#macro>`语句来定义宏。
宏可以接受参数,并在模板中多次调用。
例如:```<#macro printName name><p>Hello, ${name}!</p></#macro><@printName name="Alice" /><@printName name="Bob" />```5. 引入外部模板:使用`<#include>`语句来引入外部模板文件,并在当前模板中使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
${String?index_of("查找的子串"[,开始查找的索引])} //在字符串中查找子串第一次出现处的索引,没有找到则返回-1
${String?contains("str")} //判断字符串中是否包含子串,返回布尔值
3.FreeMarker是一个轻量级组件(易于嵌入到产品中),不需要Servlet环境
4.可以在FreeMarker模板中清楚和直觉地访问XML对象模型 //如:用<#recurse>和<#visit>指令(2.3版本)结构递归遍历XML树
5.FreeMarker页面的扩展/后缀名为.ftl
集合对象?first //获取集合中的第一个值
集合对象?last //获取集合中的最后一个值
集合对象?reverse //将集合中的顺序反转(即倒序排序)
集合对象?size //获取集合中的元素个数
集合对象?sort //将集合中的对象转化为字符串后顺序排序
判断对象是否为空:?exists
判断变量是否为空:?if_exists
判断集合/数组中是否有数据:?has_content
(2).switch结构:
<#switch 变量>
<#case value>...<#break>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</tr></td></table>
</#macro>
集合对象?sort_by(value) //按集合中对象的属性value进行排序
7.ftl访问Hash:
hash对象?keys //返回hash中的所有key,返回结果为集合
hash对象?values //返回hash中的所有value,返回结果为sequence
调用时在调用宏体中加入要嵌套的内容:<@宏名>嵌套内容</@宏名>,输出:<table border=4 cellspacing=0 cellpadding=4><tr><td>嵌套内容</tr></td></table>
n.ftl中的其它用法:
取值:${4个范围内的非int型的任意对象},#{4个范围内的int型变量}
一.FreeMarker简介:
1.FreeMarker是一个模板引擎,一个基于模板生成HTML/XML/RTF/Java源代码等等的通用工具,使用纯Java编写
2.FreeMarker与容器无关,因为它并不知道HTTP或Servlet,也可以在FreeMarker模板中使用JSP标记库 //支持JSP标记库
f:只替换第一个出现被替换字符串的字符串
r:表示第二个参数(替换后的子串)是正则表达式
m:
s:
c:
${String?length} //获取字符串长度
${String?trim} //字符串去空格
${String?upper_case} //将字母字符串转为大写
获取集合的当前循环索引:集合的别名_index
判断是否达到最后一次循环:集合的别名_has_next //返回true/false
注:ftl中可以使用类似[i]语法的索引方式访问集合/数组中的元素、可以在循环外访问循环体内的控制变量
6.ftl访问集合/数组:
#{int?string.percent} //将数字转为百分比(%)形式,还可用${int?string("percent")}
数字格式化:#{变量;format},其中format可以是:mn:小数部分最少n位,Mn:小数部分最多n位;如:
<#assign a=2.582/>,<#assign b=4/>
8.ftl中定义变量:
(1).使用<#assign 变量名="值">指令定义局部变量 //用于在页面创建或替换一个变量(当前ftl范围内/page范围内的变量声明,在宏定义体中有效)
(2).plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,
注释使用<#-- 注释内容 -->
${String?split("*")} //用指定的分隔符将字符串拆分成数组
${String?replace("字符串中指定的子串","替换后的子串"[,"规则参数"])} //将字符串中的子串从左到右替换为指定的子串,规则参数有:i、r、m、s、c、f,具体含义如下:
i:不区分大小写
算术运算符:+、-、*、/、%
逻辑操作符:&&:and、||:or、!:not //只能用于布尔值
<#recurse>和<#visit>指令 //递归遍历XML树,访问XML对象模型
10.import指令:用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中
${String?string("yyyy-MM-dd HH:mm:ss zzzz")/("EEE,MMM d,''yy")/("EEEE,MMMM dd,yyyy,hh:mm:ss a '('zzz')'")} //日期格式化
${String?substring(startIndex,endIndex)} //截取字符串,还可以用更简单的${String[0..number]}
${String?number} //将字符串转为数字
${bool?string("yes/是","no/否")} //布尔值格式化
3.ftl中对整型的处理:
#{int?c} //将数字转为字符串,还可用#{int?string}
#{int?string.currency} //将数字转为货币(¥)形式,还可用#{int?string("currency")}
、检查map是否为空、获得key或值的list
1.ftl中判断对象/字符串是否为null:
在<#if>指令中用Object或String?exists判断,在${}指令中用Object或String?if_exists输出布尔形式判断
2.ftl中对字符串的处理
(3).使用local指令创建和替换 9.ftl中 Nhomakorabea运算符:
比较运算符可以用gt、gte、、lt、lte、或>、>=、==、<、<=、!= //不推荐使用后者(因为麻烦),因为Freemarker会将>解释成FTL标记的结束字符,故对于>和>=要用括号括起来(如:<#if (x>y)>)
二.FreeMarker使用:
三.FreeMarker中的指令语法:ftl页面支持所有Html标记和js、css语法,ftl指令区分大小写,ftl页面中的<script>中也可使用ftl指令
注:ftl中可以使用内置函数操作/维护与Java后台程序无关的string、list和map等,如:通过索引访问list元素、获得子list、合并list、对list排序,通过key变量访问map元素
<#import "/lib/common.ftl" as com> //此处将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中
11.include指令:用于包含指定页面(类似JSP的包含指令,如:<#include "/common/copyright.ftl" encoding="GBK">)
<#case value>...<#break>
<#default>...<#break>
</#switch>
5.ftl中的循环结构:<#list 4个范围内的集合/数组 as 遍历的集合/数组中的对象的别名>循环体</#list> //ftl中的循环也支持break子句
12.setting指令:用来设置ftl使用的环境,如:<#setting locale="en_US">
13.ftl中的宏:宏相当于程序中的函数,可以传参,可以调用宏以执行宏体内的内容,在那里调用宏宏体中的内容就相当于写在那里。以便在模板中通过用户定义指令使用该变量
(1).宏的定义:用macro指令定义,如:<#macro 宏名 [宏的输入参数名 ...(可选)]>Hello Joe!</#macro> //创建时可带多个参数,可在定义时指定参数的缺省值,否则在调用宏
时必须对所有参数赋值,宏的参数只在宏范围中有效,在宏体中使用宏中的参数用${参数名}
(2).宏的调用:使用@表示调用宏,可以是双标签也可以是单标签,如:<@宏名 [宏的输入参数名="值" ...(可选,当宏定义中带参时这里才有参数)]></@宏名> //宏调用中可嵌套