FreeMarker语法知识
freemarker语法 sql语句
freemarker语法 sql语句使用freemarker语法编写sql语句时,可以使用以下几种常用语法:1. 查询语句```SELECT * FROM table_name WHERE column_name = ${variable}```这个语句用于查询表中满足条件的数据,其中`${variable}`是freemarker变量,可以根据实际情况进行替换。
2. 插入语句```INSERT INTO table_name (column1, column2, column3) VALUES (${value1}, ${value2}, ${value3})```这个语句用于向表中插入新的数据,`${value1}`等变量表示要插入的值。
3. 更新语句```UPDATE table_name SET column_name = ${new_value} WHERE condition```这个语句用于更新表中满足条件的数据,`${new_value}`表示要更新的新值。
4. 删除语句```DELETE FROM table_name WHERE condition```这个语句用于删除表中满足条件的数据。
5. 使用循环```<#list list as item>SELECT * FROM table_name WHERE column_name = ${item} </#list>```这个语句用于根据列表中的元素循环生成查询语句。
6. 使用条件判断```<#if condition>SELECT * FROM table_name WHERE column_name = ${variable}<#else>SELECT * FROM table_name</#if>```这个语句用于根据条件生成不同的查询语句。
7. 使用函数```SELECT * FROM table_name WHERE column_name = ${variable?upper_case}```这个语句用于将变量的值转换为大写字母后进行查询。
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是一种模板引擎,它使用一种类似于HTML的标记语言来生成文本输出。
以下是关于Freemarker文档语法的详细介绍: 1. 变量。
在Freemarker中,使用`${}`来表示变量,例如`${}`表示输出变量user的name属性。
2. 指令。
Freemarker中的指令以`<#`开头,以`>`结尾,例如`<#if>`、`<#list>`等。
指令可以用于条件判断、循环等操作。
3. 注释。
在Freemarker模板中,可以使用`<#--`和`-->`来添加注释,注释部分不会被输出到最终的文本中。
4. 条件判断。
使用`<#if>`、`<#else>`和`<#elseif>`来进行条件判断,例如: <#if user.age gt 18>。
成年人。
<#else>。
未成年人。
</#if>。
5. 循环。
使用`<#list>`来进行循环操作,例如:<#list users as user>。
${}。
</#list>。
6. 宏。
宏可以在Freemarker模板中定义和调用,类似于函数。
例如: <#macro greeting>。
Hello, World!</#macro>。
在其他地方可以通过`<@greeting/>`来调用宏。
7. 导入。
使用`<#import>`来导入其他模板或者Java类,例如:<#import "header.ftl" as header>。
<#import "java.util.Map" as map>。
以上是关于Freemarker文档语法的简要介绍,希望可以帮助你更好地了解Freemarker模板引擎的语法规则。
freemarker高级语法
freemarker高级语法Freemarker高级语法Freemarker是一种模板引擎,它使用简单而强大的语法来生成动态内容。
除了基本语法外,Freemarker还提供了一些高级语法,用于更灵活地处理模板和数据。
本文将介绍一些常用的Freemarker高级语法,以帮助开发人员更好地使用该模板引擎。
一、条件语句在Freemarker中,我们可以使用条件语句来根据特定的条件决定是否输出内容。
条件语句主要有if-else和switch-case两种形式。
1. if-else语句if-else语句用于在满足特定条件时输出内容,语法如下:```<#if condition>输出内容1<#elseif condition2>输出内容2<#else>输出内容3</#if>```其中,condition是一个布尔表达式,可以是变量、逻辑运算符、比较运算符等。
当condition为true时,输出内容1;当condition为false且condition2为true时,输出内容2;否则,输出内容3。
2. switch-case语句switch-case语句用于根据不同的取值输出不同的内容,语法如下:```<#switch variable><#case value1>输出内容1<#case value2>输出内容2<#default>输出内容3</#switch>```其中,variable是一个变量,可以是数值、字符串等。
当variable 的取值与某个case的值相等时,输出相应的内容;如果没有匹配的case,则输出default中的内容。
二、循环语句循环语句是在Freemarker中非常常用的一种语法,它可以用来遍历集合、重复输出内容等。
常用的循环语句有list、foreach和while。
1. list循环list循环用于遍历一个列表,并输出其中的每个元素。
freemarker语法
语法FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:1. 文本:直接输出的部分2. 注释:<#-- ... -->格式部分,不会输出3. 插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出4. FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出1. FTL指令规则在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.1.开始标签:<#directivename parameter>2.结束标签:</#directivename>3.空标签:<#directivename parameter/>实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.使用FTL标签时, 应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样.如果全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符.2. 插值规则FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}2.1 通用插值对于通用插值,又可以分为以下4种情况:1. 插值结果为字符串值:直接输出表达式结果2. 插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:<#settion number_format="currency"/><#assign answer=42/>${answer}${answer?string} <#-- the same as ${answer} -->${answer?string.number}${answer?string.currency}${answer?string.percent}${answer}输出结果是:$42.00$42.0042$42.004,200%3. 插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}${lastUpdated?string("EEE, MMM d, ''yy")}${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}输出结果是:2008-04-08 08:08:08 Pacific Daylight TimeTue, Apr 8, '03Tuesday, April 08, 2003, 08:08:08 PM (PDT)4. 插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:<#assign foo=true/>${foo?string("yes", "no")}输出结果是:yes2.2 数字格式化插值数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:mX:小数部分最小X位MX:小数部分最大X位如下面的例子:<#assign x=2.582/><#assign y=4/>#{x; M2} <#-- 输出2.58 -->#{y; M2} <#-- 输出4 -->#{x; m2} <#-- 输出2.6 -->#{y; m2} <#-- 输出4.0 -->#{x; m1M2} <#-- 输出2.58 -->#{x; m1M2} <#-- 输出4.0 -->3. 表达式表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker 标签结合,用于控制输出.实际上FreeMarker的表达式功能非常强大,它不仅支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能.3.1 直接指定值使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象.1. 字符串直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子:${"我的文件保存在C:\\盘"}${'我名字是\"annlee\"'}输出结果是:我的文件保存在C:\盘我名字是"annlee"FreeMarker支持如下转义字符:\";双引号(u0022)\';单引号(u0027)\\;反斜杠(u005C)\n;换行(u000A)\r;回车(u000D)\t;Tab(u0009)\b;退格键(u0008)\f;Form feed(u000C)\l;<\g;>\a;&\{;{\xCode;直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符.如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.看如下代码:${r"${foo}"}${r"C:\foo\bar"}输出结果是:${foo}C:\foo\bar2. 数值表达式中的数值直接输出,不需要引号.小数点使用"."分隔,不能使用分组","符号.FreeMarker目前还不支持科学计数法,所以"1E3"是错误的.在FreeMarker表达式中使用数值需要注意以下几点:a)数值不能省略小数点前面的0,所以".5"是错误的写法b)数值8 , +8 , 8.00都是相同的3. 布尔值直接使用true和false,不使用引号.4. 集合集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>${x}</#list>输出结果是:星期一星期二星期三星期四星期五星期六星期天除此之外,集合元素也可以是表达式,例子如下:[2 + 2, [1, 2, 3, 4], "whatnot"]还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..25,Map对象Map对象使用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value 对之间以英文逗号","分隔.下面是一个例子:{"语文":78, "数学":80}Map对象的key和value都是表达式,但是key必须是字符串3.2 输出变量值FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况1. 顶层变量所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:Map root = new HashMap(); //创建数据模型root.put("name","annlee"); //name是一个顶层变量对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法: ${name}2. 输出集合元素如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法:${week[2]} //输出第三个集合元素此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素3. 输出Map元素这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:Map root = new HashMap();Book book = new Book();Author author = new Author();author.setName("annlee");author.setAddress("gz");book.setName("struts2");book.setAuthor(author);root.put("info","struts");root.put("book", book);为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法: //全部使用点语法book["author"].namebook.author["name"] //混合使用点语法和方括号语法book["author"]["name"] //全部使用方括号语法使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果.3.3字符串操作FreeMarker的表达式对字符串操作非常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的子串等.字符串连接有两种语法:1. 使用${..}或#{..}在字符串常量部分插入表达式的值,从而完成字符串连接.2. 直接使用连接运算符+来连接字符串例如有如下数据模型:Map root = new HashMap(); root.put("user","annlee");下面将user变量和常量连接起来:${"hello, ${user}!"} //使用第一种语法来连接${"hello, " + user + "!"} //使用+号来连接上面的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全一样.值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:<#if ${isBig}>Wow!</#if><#if "${isBig}">Wow!</#if>应该写成:<#if isBig>Wow!</#if>截取子串可以根据字符串的索引来进行,截取子串时如果只指定了一个索引值,则用于取得字符串中指定索引所对应的字符;如果指定两个索引值,则返回两个索引中间的字符串子串.假如有如下数据模型:Map root = new HashMap(); root.put("book","struts2,freemarker");可以通过如下语法来截取子串:${book[0]}${book[4]} //结果是su${book[1..4]} //结果是tru3.4 集合连接运算符这里所说的集合运算符是将两个集合连接成一个新的集合,连接集合的运算符是+,看如下的例子:<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>${x}</#list>输出结果是:星期一星期二星期三星期四星期五星期六星期天3.5 Map连接运算符Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子: <#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>语文成绩是${scores.语文}数学成绩是${scores.数学}Java成绩是${scores.Java}输出结果是:语文成绩是86数学成绩是87Java成绩是933.6 算术运算符FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看如下的代码:<#assign x=5>${ x * x - 100 }${ x /2 }${ 12 %10 }输出结果是:-75 2.5 2在表达式中使用算术运算符时要注意以下几点:1,运算符两边的运算数字必须是数字2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35使用内建的int函数可对数值取整,如:<#assign x=5>${ (x/2)?int }${ 1.1?int }${ 1.999?int }${ -1.1?int }${ -1.999?int }结果是:2 1 1 -1 -13.7 比较运算符表达式中支持的比较运算符有如下几个:1. =或者==:判断两个值是否相等.2. !=:判断两个值是否不等.3. >或者gt:判断左边值是否大于右边值4. >=或者gte:判断左边值是否大于等于右边值5. <或者lt:判断左边值是否小于右边值6. <=或者lte:判断左边值是否小于等于右边值注意:=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>3.8 逻辑运算符逻辑运算符有如下几个:逻辑与:&&逻辑或:||逻辑非:!逻辑运算符只能作用于布尔值,否则将产生错误3.9 内建函数FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量.下面是常用的内建的字符串函数: html:对字符串进行HTML编码cap_first:使字符串第一个字母大写lower_case:将字符串转换成小写upper_case:将字符串转换成大写trim:去掉字符串前后的空白字符下面是集合的常用内建函数size:获取序列中元素的个数下面是数字值的常用内建函数int:取得数字的整数部分,结果带符号例如:<#assign test="Tom & Jerry">${test?html}${test?upper_case?html}结果是:Tom & Jerry TOM & JERRY3.10 空值处理运算符FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同.为了处理缺失变量,FreeMarker提供了两个运算符:!: 指定缺失变量的默认值??: 判断某个变量是否存在其中,!运算符的用法有如下两种:variable!或variable!defaultV alue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false3.11 运算符的优先级FreeMarker中的运算符优先级如下(由高到低排列):1. 一元运算符:!2. 内建函数:?3. 乘除法:*, / , %4. 加减法:- , +5. 比较:> , < , >= , <= (lt , lte , gt , gte)6. 相等:== , = , !=7. 逻辑与:&&8. 逻辑或:||9. 数字范围:..实际上,我们在开发过程中应该使用括号来严格区分,这样的可读性好,出错少4. FreeMarker的常用指令FreeMarker的FTL指令也是模板的重要组成部分,这些指令可实现对数据模型所包含数据的抚今迭代,分支控制.除此之外,还有一些重要的功能,也是通过FTL指令来实现的.4.1 if指令这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下:<#if condition>...<#elseif condition>...<#elseif condition>...<#else> ...</#if>例子如下:<#assign age=23><#if (age>60)>老年人<#elseif (age>40)>中年人<#elseif (age>20)>青年人<#else> 少年人</#if>输出结果是:青年人上面的代码中的逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号.4.2 switch , case , default , break指令这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: <#switch value><#case refV alue>...<#break><#case refV alue>...<#break><#default>...</#switch>4.3 list, break指令list指令是一个迭代输出指令,用于迭代输出数据模型中的集合,list指令的语法格式如下:<#list sequence as item>...</#list>上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量:item_index:当前变量的索引值item_has_next:是否存在下一个对象也可以使用<#break>指令跳出迭代例子如下:<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>${x_index + 1}.${x}<#if x_has_next>,</if><#if x="星期四"><#break></#if></#list>4.4 include指令include指令的作用类似于JSP的包含指令,用于包含指定页.include指令的语法格式如下: <#include filename [options]>在上面的语法格式中,两个参数的解释如下:filename:该参数指定被包含的模板文件options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true.4.5 import指令该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下:<#import "/lib/common.ftl" as com>上面的代码将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com 的Map对象中.创建库下面是一个创建库的例子(假设保存在lib/my_test.ftl中):并可以通过import指令中指定的散列变量访问库中的变量:可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间●可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子:4.6 noparse指令noparse指令指定FreeMarker不处理该指定里包含的内容,该指令的语法格式如下: <#noparse>...</#noparse>看如下的例子:<#noparse><#list books as book><tr><td>${}<td>作者:${book.author}</#list></#noparse>输出如下:<#list books as book><tr><td>${}<td>作者:${book.author}</#list>4.7 escape , noescape指令escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使用escape指令的语法格式如下:<#escape identifier as expression>...<#noescape>...</#noescape></#escape>看如下的代码:<#escape x as x?html>First name:${firstName}Last name:${lastName}Maiden name:${maidenName}</#escape>上面的代码等同于:First name:${firstName?html}Last name:${lastName?html}Maiden name:${maidenName?html}escape指令在解析模板时起作用而不是在运行时起作用,除此之外,escape指令也嵌套使用,子escape继承父escape的规则,如下例子:<#escape x as x?html>Customer Name:${customerName}Items to ship;<#escape x as itemCodeToNameMap[x]>${itemCode1}${itemCode2}${itemCode3}${itemCode4}</#escape></#escape>上面的代码类似于:Customer Name:${customerName?html}Items to ship;${itemCodeToNameMap[itemCode1]?html}${itemCodeToNameMap[itemCode2]?html}${itemCodeToNameMap[itemCode3]?html}${itemCodeToNameMap[itemCode4]?html}对于放在escape指令中所有的插值而言,这此插值将被自动加上escape表达式,如果需要指定escape指令中某些插值无需添加escape表达式,则应该使用noescape指令,放在noescape指令中的插值将不会添加escape表达式.4.8 assign指令assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量,assign指令的用法有多种,包含创建或替换一个顶层变量, 或者创建或替换多个变量等,它的最简单的语法如下:<#assign name=value [in namespacehash]>,这个用法用于指定一个名为name的变量,该变量的值为value,此外,FreeMarker允许在使用assign指令里增加in子句,in 子句用于将创建的name变量放入namespacehash命名空间中.assign指令还有如下用法:<#assign name1=value1 name2=value2 ... nameN=valueN [in namespacehash]>,这个语法可以同时创建或替换多个顶层变量,此外,还有一种复杂的用法,如果需要创建或替换的变量值是一个复杂的表达式,则可以使用如下语法格式:<#assign name [in namespacehash]>capture this</#assign>,在这个语法中,是指将assign指令的内容赋值给name变量.如下例子:<#assign x><#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>${n}</#list></#assign>${x}上面的代码将产生如下输出:星期一星期二星期三星期四星期五星期六星期天虽然assign指定了这种复杂变量值的用法,但是我们也不要滥用这种用法,如下例子:<#assign x>Hello ${user}!</#assign>,以上代码改为如下写法更合适:<#assign x="Hello ${user}!">4.9 setting指令该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取值范围包含如下几个:locale:该选项指定该模板所用的国家/语言选项number_format:指定格式化输出数字的格式boolean_format:指定两个布尔值的语法格式,默认值是true,falsedate_format,time_format,datetime_format:指定格式化输出日期的格式time_zone:设置格式化输出日期时所使用的时区4.10 macro , nested , return指令macro可以用于实现自定义指令,通过使用自定义指令,可以将一段模板片段定义成一个用户指令,使用macro指令的语法格式如下:<#macro name param1 param2 ... paramN>...<#nested loopvar1, loopvar2, ..., loopvarN>...<#return>...</#macro>在上面的格式片段中,包含了如下几个部分:name:name属性指定的是该自定义指令的名字,使用自定义指令时可以传入多个参数paramX:该属性就是指定使用自定义指令时报参数,使用该自定义指令时,必须为这些参数传入值nested指令:nested标签输出使用自定义指令时的中间部分nested指令中的循环变量:这此循环变量将由macro定义部分指定,传给使用标签的模板return指令:该指令可用于随时结束该自定义指令.看如下的例子:<#macro book> //定义一个自定义指令j2ee</#macro><@book /> //使用刚才定义的指令上面的代码输出结果为:j2ee在上面的代码中,可能很难看出自定义标签的用处,因为我们定义的book指令所包含的内容非常简单,实际上,自定义标签可包含非常多的内容,从而可以实现更好的代码复用.此外,还可以在定义自定义指令时,为自定义指令指定参数,看如下代码:<#macro book booklist> //定义一个自定义指令booklist是参数<#list booklist as book>${book}</#list></#macro><@book booklist=["spring","j2ee"] /> //使用刚刚定义的指令上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee不仅如此,还可以在自定义指令时使用nested指令来输出自定义指令的中间部分,看如下例子: <#macro page title><html><head><title>FreeMarker示例页面- ${title?html}</title></head><body><h1>${title?html}</h1><#nested> //用于引入用户自定义指令的标签体</body></html></#macro>上面的代码将一个HTML页面模板定义成一个page指令,则可以在其他页面中如此page指令:<#import "/common.ftl" as com> //假设上面的模板页面名为common.ftl,导入页面<@com.page title="book list"><u1><li>spring</li><li>j2ee</li></ul></@com.page>从上面的例子可以看出,使用macro和nested指令可以非常容易地实现页面装饰效果,此外,还可以在使用nested指令时,指定一个或多个循环变量,看如下代码:<#macro book><#nested 1> //使用book指令时指定了一个循环变量值<#nested 2></#macro><@book ;x> ${x} .图书</@book>当使用nested指令传入变量值时,在使用该自定义指令时,就需要使用一个占位符(如book指令后的;x).上面的代码输出文本如下:1 .图书2 .图书在nested指令中使用循环变量时,可以使用多个循环变量,看如下代码:<#macro repeat count><#list 1..count as x> //使用nested指令时指定了三个循环变量<#nested x, x/2, x==count></#list></#macro><@repeat count=4 ; c halfc last>${c}. ${halfc}<#if last> Last! </#if></@repeat>上面的输出结果为:1. 0.52. 13. 1.54. 2 Last;return指令用于结束macro指令,一旦在macro指令中执行了return指令,则FreeMarker不会继续处理macro指令里的内容,看如下代码:<#macro book>spring<#return>j2ee</#macro><@book />上面的代码输出:spring,而j2ee位于return指令之后,不会输出.用户定义指令●宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏●基本用法宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:作为用户定义指令使用宏变量时,使用@替代FTL标记中的#如果没有体内容,也可以使用:●参数在macro指令中可以在宏变量之后定义参数,如:可以这样使用这个宏变量:输出结果是:这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式宏可以有多参数,下面是一个例子:可以这样使用该宏变量:可以在定义参数时指定缺省值,如:宏的参数是局部变量,只能在宏定义中有效●嵌套内容用户定义指令可以有嵌套内容,使用<#nested>指令执行指令开始和结束标记之间的模板片断 例子:这样使用该宏变量:输出结果:<#nested>指令可以被多次调用,例如:输出结果:嵌套内容可以是有效的FTL,下面是一个有些复杂的例子:输出结果:输出结果:●在宏定义中使用循环变量用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字例子:输出结果:⏹调用时少指定循环变量,则多指定的值不可见⏹调用时多指定循环变量,多余的循环变量不会被创建。
framemaker 语法
framemaker 语法FreeMarker是一款用Java语言编写的模板引擎,用于生成各种文本,如HTML、XML、Java等。
以下是FreeMarker语法的一些示例:1.变量替换:2.freemarker复制代码<#assign name="John">Hello ${name}!1.控制结构:2.freemarker复制代码<#if name == "John">Hello John!<#else>Hello ${name}!</#if>1.宏定义和调用:2.freemarker复制代码<#macro greet person><font size="+2">Hello ${person}!</font></#macro><@greet person="John"/>1.列表和迭代:2.freemarker复制代码<#list items as item>${item}</#list>1.内置函数:2.freemarker复制代码<#function formatDate date><#return date?string("yyyy-MM-dd HH:mm:ss")></#function>${formatDate(date)}这些只是FreeMarker语法的一些基本示例,FreeMarker还支持更复杂的表达式和控制结构。
freemarker语法
By zhxing1、if, else, elseif语法:<#if condition>...<#elseif condition2>...<#elseif condition3>......<#else>...</#if>备注:condition、condition2···必须为boolean 类型,<#elseif ··>、<#else>可有0或多个。
实例:<#if x == 1>x is 1<#elseif x == 2>x is 2<#elseif x == 3>x is 3<#elseif x > 4>x is 4<#else>x is not 1 nor 2 nor 3 nor 4</#if>备注:< 或 > 号必须转义,否则出错。
转义请参考其他文档。
2、switch, case, default, break语法<#switch value><#case refValue1>...<#break><#case refValue2>...<#break>...<#case refValueN>...<#break><#default>...</#switch>备注:该指令官方不推荐使用了,可以用if, else, elseif 指令代替。
3、list, break语法<#list sequence as item>...</#list>备注: sequence 为一个sequence 或者 collection 类型。
item 为循环的变量。
FreeMarker的基础语法使用心得和技巧
数字值相关常用的内建函数: 1. int:取得数字的整数部分。
举例:
root.put("htm2", "<b>粗体</b>"); 内建函数: ${htm2?html}
十、空值处理运算符 FreeMarker的变量必须赋值,否则就会抛出异常。而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解 null值。 FreeMarker提供两个运算符来避免空值: 1. !:指定缺失变量的默认值; 2. ??:判断变量是否存在。 !运算符有两种用法:variable!或variable!defaultValue。第一种用法不给变量指定默认值,表明默认值是空字符串、长度为0的集合、或长度 为0的Map对象。 使用!运算符指定默认值并不要求默认值的类型和变量类型相同。
//显示生成的数据,//将合并后的数据打印到控制台 Writer out = new OutputStreamWriter(System.out); t1.process(root, out); out.flush();
//显示生成的数据,//将合并后的数据直接返回成字符串! // StringWriter out = new StringWriter(); // t1.process(root, out); // out.flush(); // String temp = out.toString(); // System.out.println(temp); } } 6. 编译和运行Test1.java文件,控制台打印:
6. 时间对象 root.put("date1", new Date()); ${date1?string("yyyy-MM-dd HH:mm:ss")}
freemaker语法
freemaker语法Freemarker是一种模板引擎,可以用于生成动态内容的模板。
它的语法相对简洁易懂,以下是Freemarker的一些常用语法:1. 变量定义和输出:- 定义变量:`<#assign variableName = value>`- 输出变量:`${variableName}`2. 条件判断:- if语句:`<#if condition>...</#if>`- if-else语句:`<#ifcondition>...</#else>...</#if>`- if-elseif-else语句:`<#ifcondition1>...</#elseifcondition2>...</#else>...</#if>`3. 循环:- foreach循环:`<#list collection as item>...</#list>`- 遍历索引:`<#list collection as item index>...</#list>`4. 宏定义和调用:- 定义宏:`<#macro macroName parameter1 parameter2>...</#macro>`- 调用宏:`<@macroName parameter1=xxx parameter2=yyy />`5. 内建函数:- 字符串处理:`<#assign result =myString?substring(0, 5)>`- 数字格式化:`${myNumber?string("0.00")}`- 集合操作:`${myList?size}`- 日期处理:`${myDate?string("yyyy-MM-dd")}`6. 引入其他模板:- 引入模板:`<#include "otherTemplate.ftl">`7. 注释:- 单行注释:`<#-- This is a comment -->`- 多行注释:`<#-- This is amulti-line comment -->`这只是Freemarker语法的一小部分,还有很多其他功能和语法可以用于更复杂的模板生成。
FREEMAKE语法介绍
FREEMAKE语法介绍1.变量初始化标签语法<#assign x=5>显示变量${x}显示结果为:52.条件判断标签<#assign age=60><#if (age>=60) >你老了<#else>你还年轻</#if>显示结果为:你老了3.循环标签list可以java的List对象,list可以放置中可以放置任意java对象。
我们新建一个Pesson对象。
class person {private String name;private int age;setter;getter;省略}List list=new ArrayList();Person p=new Person(“张山”,20);list.add(p);p=new Person(“李四”,23);<#list list as person>姓名:${person.getName()},年龄:${person.getAge();}</#list>也可以如下写法:<#list list as person>姓名:${},年龄:${person.age}</#list>如果传入的是Map对象可以使用键值进行访问,测试代码如下:List list=new ArrayList();Map m=new HashMap();m.put("name","张山");m.put("age",20);list.add(m);m=new HashMap();m.put("name","李四");m.put("age",25);list.add(m);标签写法:<#list list as person>姓名:${},年龄:${person.age}</#list>如果需要在模版中输出${x},相关的模版如何写呢?模版写法:${r"${x}"}在引号或单引号之前加r输出原生字符串。
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的template用法
freemarker的template用法Freemarker是一个模板引擎,主要用于生成动态内容,如HTML网页、电子邮件、配置文件等。
下面是Freemarker的一些常用模板用法:1. 变量插值:使用`${变量名}`插入变量的值。
例如:```<h1>${title}</h1>```2. 条件判断:使用`<#if>...</#if>`结构来执行条件判断。
例如:```<#if condition>...<#else>...</#if>```3. 循环迭代:使用`<#list>...</#list>`结构来进行循环迭代。
例如:```<#list items as item><li>${item}</li></#list>```4. 定义宏:使用`<#macro>...</#macro>`定义一个宏。
例如:```<#macro greet name>Hello ${name}!</#macro>```5. 调用宏:使用`<@宏名>...</@宏名>`调用一个宏。
例如:```<@greet "John" />```6. 引入外部模板:使用`<#include "模板路径">`引入外部模板。
例如:```<#include "header.ftl">```以上是Freemarker的一些常用模板用法,可以根据实际需求灵活运用。
freemarker数据模板引擎语法
Freemarker数据模板引擎语法介绍一、概述1. Freemarker 是一个用Java语言编写的模板引擎。
2. 它是一个基于模板的文本生成引擎,用来生成HTML、XML、JSP等各种文本文件。
通过模板引擎,我们可以很容易地将数据和模板文件结合,生成我们想要的数据格式。
二、Freemarker语法1. 模板标签模板标签是Freemarker中最常用的语法标记,用于指定要在模板中填充的数据或进行逻辑控制。
${name}标签会被Freemarker引擎替换成name变量所代表的数据。
2. 表达式Freemarker支持丰富的表达式语法,包括数学运算、逻辑运算、字符串处理等。
${num + 1}表示将num变量的值加1。
3. 指令Freemarker提供了一系列指令用于控制模板文件的生成过程,例如条件判断、循环、导入外部文件等。
<#if condition>...</#if>指令用于条件判断。
4. 注释在Freemarker模板中,我们可以使用注释来对模板文件进行说明或标记。
<#-- This is ament -->。
三、数据模型1. 在Freemarker中,数据模型是一个数据存储对象,用于在模板中填充数据。
2. 数据模型可以是Java中的对象、集合、数组等。
3. 我们可以使用<#list>指令对数据模型进行遍历。
4. 数据模型可以通过<#assign>指令或在模板引擎中进行设置。
5. 在模板中访问数据模型的数据,通常使用${data}语法。
四、模板文件1. Freemarker使用.ftl后缀作为模板文件的标识。
2. 模板文件是一个文本文件,其中包含数据模型的填充标签、表达式、指令等。
3. 我们可以在模板文件中嵌套使用数据模型和指令,以便动态生成文本数据。
4. 模板文件一般存放在项目的特定目录,供程序在运行时读取并进行生成。
五、应用实例1. 我们可以使用Freemarker来生成Web页面,动态填充页面中的数据。
freemaker的基本语法
FreeMaker 常用 语法 总结
Freemarker Note1. 基本知识点1.1注视注释标志<#--这里是注释-->1.2 数字:直接输入,不需要引号1)、精度数字使用“.”分隔,不能使用分组符号2)、目前版本不支持科学计数法,所以“1E3”是错误的3)、不能省略小数点前面的0,所以“.5”是错误的4)、数字8、+8、08和8.00都是相同的1.3 布尔值true和false,不使用引号1.4 变量获取变量:${变量名}变量名只能字母、数字、下划线、$、#、@ 的组合,且不能以数字开头。
<#assign var = value >定义变量并初始化<#local var = value>在macro 或者function 中定义局部变量并初始化<#global var = value >定义全局变量并初始化${var} 输出并替换为表达式的值。
变量表达式在指令中的使用情况:变量表达式可以在指令中,用“”的方式存在,不如:<#include "/footer/${company}.html">.但是不允许下面的方式存在:<#if ${isBig}>Wow!</#if>, 正确写法是:<#if isBig>Wow!</#if>.而且<#if "${isBig}">Wow!</#if>写法也不正确,因为"${isBig}"返回的是字符串,不是boolean类型。
1.5 判断对象是不是null<#if mouse?exists>Mouse found <#else>也可以直接${mouse?if_exists})输出布尔形1.6 控制语句:<#if condition><#elseif condition><#else></#if>条件判断1.7 导入<#include "inc"> inc 为另一个flt文件,在同一级目录下。
freemarker语法完整版
freemarker语法完整版最常用的概念1、scalars:存储单值字符串:直观文本由单或双引号内加出来。
数字:轻易采用数值。
日期:通常从数据模型赢得布尔值:true或false,通常在标记中使用2、hashes:当好其它对象的容器,每个都关联一个唯一的查阅名字具备一个唯一的查阅名字和他涵盖的每个变量相关联。
3、sequences:充当其它对象的容器,按次序访问使用数字和他包含的每个变量相关联。
索引值从0开始。
4、子集变量:除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由指令使用的受限sequences。
5、方法:通过传达的参数展开排序,以崭新对象回到结果方法变量通常就是基于得出的参数排序值在数据模型中定义。
6、用户自定义ftl指令:宏和变换器7、节点节点变量则表示为树型结构中的一个节点,通常在xml处置中采用。
在模板里对sequences和hashes初始化sequences1.[dyou‖,‖me‖,‖he‖]2.1..1003.[{dakey‖:‖avalue‖},{dakey1‖:‖avalue1‖},{dbkey‖:‖bvalue‖},{dbkey1‖:‖bvalue1‖},]hashes{dyou‖:‖a‖,‖me‖:‖b‖,‖he‖:‖c‖}注释标志这里就是注解-->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常见语法大全
freemarker常见语法大全格式比较乱一些,适合ctrl+f搜索关键字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-去掉字符串前后的空白字符对于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> 标签可以在宏中多次调用,也可以将多个宏组合进行嵌套for循环的精简版:<#list 1..count as x></#list>宏的循环变量,配合嵌套标签进行参数传递,<#macro repeat count><#list 1..count as x><#nested x, x/2, x==count> //这里的三个参数,将会传递到嵌套内容中</#list></#macro><@repeat count=4 ; c, halfc, last>${c}. ${halfc}<#if last> Last!</#if> //这里的内容由macro中的<#nested>进行参数的传递,传递的数量任意,当注意需要宏接受这些</@repeat>上述还需要注意;的使用参数的数量是可变的,并不要求全部都有,但是效果不同在模板中定义变量在模板中定义的变量有三种类型:plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。
FreeMarker语法之表达式(二)
FreeMarker语法之表达式(二)上期lola介绍了FreeMarker语法之表达式(一)这期lola将介绍FreeMarker语法之表达式(二)也是FreeMarker 语法之表达式的完结篇。
1.6 算术运算符FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , % 看如下的代码:<#assign x=5>${ x * x - 100 }${ x /2 }${ 12 %10 }输出结果是:-75 2.5 2在表达式中使用算术运算符时要注意以下几点:1,运算符两边的运算数字必须是数字2,使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35使用内建的int函数可对数值取整,如:<#assign x=5>${ (x/2)?int }${ 1.1?int }${ 1.999?int }${ -1.1?int }${ -1.999?int }结果是:2 1 1 -1 -11.7 比较运算符表达式中支持的比较运算符有如下几个:1. =或者==:判断两个值是否相等.2. !=:判断两个值是否不等.3. >或者gt:判断左边值是否大于右边值4. >=或者gte:判断左边值是否大于等于右边值5. <或者lt:判断左边值是否小于右边值6. <=或者lte:判断左边值是否小于等于右边值注意:=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:<#if (x>y)>1.8 逻辑运算符逻辑运算符有如下几个:逻辑与:&&逻辑或:||逻辑非:!逻辑运算符只能作用于布尔值,否则将产生错误1.9 内建函数FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来轮换输出变量.下面是常用的内建的字符串函数:html:对字符串进行HTML编码cap_first:使字符串第一个字母大写lower_case:将字符串转换成小写upper_case:将字符串转换成大写trim:去掉字符串前后的空白字符下面是集合的常用内建函数size:获取序列中元素的个数下面是数字值的常用内建函数int:取得数字的整数部分,结果带符号例如:<#assign test="Tom & Jerry">${test?html}${test?upper_case?html}结果是:Tom &amp; Jerry TOM &amp; JERRY1.10 空值处理运算符FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同.为了处理缺失变量,FreeMarker提供了两个运算符:!: 指定缺失变量的默认值: 判断某个变量是否存在其中,!运算符的用法有如下两种:variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false1.11 运算符的优先级FreeMarker中的运算符优先级如下(由高到低排列):1. 一元运算符:!2. 内建函数:?3. 乘除法:*, / , %4. 加减法:- , +5. 比较:> , < , >= , <= (lt , lte , gt , gte)6. 相等:== , = , !=7. 逻辑与:&&8. 逻辑或:||9. 数字范围:..实际上,我们在开发过程中应该使用括号来严格区分,这样的可读性好,出错少有关FreeMarker语法之表达式,lola分两次介绍完毕了,接下来将会为大家分享FreeMarker语法的常用指令。
FreeMarker语法详解
(4)Freemarker 与容器无关,因为它并不知道HTTP 或Servlet;Freemarker 同样可以应பைடு நூலகம்于非Web应用程 序环境。 (5)Freemarker 更适合作为Model2框架(如Struts) 的视图组件,你也可以在模板中使用JSP标记库。
(6)Freemarker 是免费的 。
Configuration cfg = new Configuration(); // 指定一个加载模版的数据源 // 这里我设置模版的根目录 cfg.setDirectoryForTemplateLoading(new File("/where/you/store/templates")); // 指定模版如何查看数据模型.这个话题是高级主题… // 你目前只需要知道这么用就可以了: cfg.setObjectWrapper(new DefaultObjectWrapper());
语法 <#escape identifier as expression>
...
</#escape> 用例 主要使用在相似的字符串变量输出,比如某一个模块的所有字符 串输出都必须是html安全的,这个时候就可以使用该表达式 <#escape x as x?html> First name: ${firstName} <#noescape>Last name: ${lastName}</#noescape> Maiden name: ${maidenName} </#escape> 相同表达式 First name: ${firstName?html} Last name: ${lastName } Maiden name: ${maidenName?html}
freemarker(FTL)常见语法大全
freemarker(FTL)常见语法大全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-去掉字符串前后的空白字符对于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> 标签可以在宏中多次调用,也可以将多个宏组合进行嵌套for循环的精简版:<#list 1..count as x></#list>宏的循环变量,配合嵌套标签进行参数传递,<#macro repeat count><#list 1..count as x><#nested x, x/2, x==count> //这里的三个参数,将会传递到嵌套内容中</#list></#macro><@repeat count=4 ; c, halfc, last>${c}. ${halfc}<#if last> Last!</#if> //这里的内容由macro中的<#nested>进行参数的传递,传递的数量任意,当注意需要宏接受这些</@repeat>上述还需要注意;的使用参数的数量是可变的,并不要求全部都有,但是效果不同在模板中定义变量在模板中定义的变量有三种类型:plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
${answer}
输出结果是:
$42.00
$42.00
42
$42.00
4,200%
3,插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}
输出结果是:
2008-04-08 08:08:08 Pacific Daylight Time
使用直接指定值语法让FreeMarker直接输出插值中的值,而不是输出变量值.直接指定值可以是字符串,数值,布尔值,集合和MAP对象.
1,字符串
直接指定字符串值使用单引号或双引号限定,如果字符串值中包含特殊字符需要转义,看下面的例子:
${"我的文件保存在C:\\盘"}
${'我名字是\"annlee\"'}
2.1 通用插值
对于通用插值,又可以分为以下4种情况:
1,插值结果为字符串值:直接输出表达式结果
2,插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
<#settion number_format="currency"/>
\f;Form feed(u000C)
\l;<
\g;>
\a;&
\{;{
\xCode;直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符.
如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.看如下代码:
${r"${foo}"}
${r"C:\foo\bar"}
输出结果是:
${foo}
C:\foo\bar
2,数值
表达式中的数值直接输出,不需要引号.小数点使用"."分隔,不能使用分组","符号.FreeMarker目前还不支持科学计数法,所以"1E3"是错误的.在FreeMarker表达式中使用数值需要注意以下几点:
Tue, Apr 8, '03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)
4,插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
<#assign foo=true/>
4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
下面是一个FreeMarker模板的例子,包含了以上所说的4个部分
<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
${x}
</#list>
输出结果是:
星期一
星期二
星期三
星期四
星期五
星期六
星期天
除此之外,集合元素也可以是表达式,例子如下:
[2 + 2, [1, 2, 3, 4], "whatnot"]
还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2
book.author["name"] //混合使用点语法和方括号语法
book["author"]["name"] //全部使用方括号语法
使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果.
3.3, 字符串操作
FreeMarker的表达式对字符串操作非常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的子串等.
1,顶层变量
所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:
Map root = new HashMap(); //创建数据模型
root.put("name","annlee"); //name是一个顶层变量
对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法:
<li>${} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>
1, FTL指令规则
在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.
1,开始标签:<#directivename parameter>
2,结束标签:</#directivename>
3,空标签:<#directivename parameter/>
实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.
<#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
book.setAuthor(author);
root.put("info","struts");
root.put("book", book);
为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法:
//全部使用点语法
book["author"].name
表达式是FreeMarker模板的核心功能,表达式放置在插值语法${}之中时,表明需要输出表达式的值;表达式语法也可与FreeMarker标签结合,用于控制输出.实际上FreeMarker的表达式功能非常强大,它不仅支持直接指定值,输出变量值,也支持字符串格式化输出和集合访问等功能.
3.1 直接指定值
此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:
week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素
3,输出Map元素
这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:
输出结果是:
我的文件保存在C:\盘
我名字是"annlee"
FreeMarker支持如下转义字符:
\";双引号(u0022)
\';单引号(u0027u000A)
\r;回车(u000D)
\t;Tab(u0009)
\b;退格键(u0008)
1,数值不能省略小数点前面的0,所以".5"是错误的写法
2,数值8 , +8 , 8.00都是相同的
3,布尔值
直接使用true和false,不使用引号.
4,集合
集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
${"hello, ${user}!"} //使用第一种语法来连接
${"hello, " + user + "!"} //使用+号来连接
上面的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全一样.
值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:
${foo?string("yes", "no")}