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模版语言讲解1.FreeMarker的简单介绍。
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。
FreeMarker我们的第一印象是用来替代JSP的,但是与JSP 不同的是FreeMarker 模板可以在 Servlet容器之外使用。
可以使用它们来生成电子邮件、配置文件、 XML 映射等。
或者直接生成HTML。
虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)2.FreeMarker 入门。
支持的数据类型:字符串、数字、布尔、日期容器:JSON、集合(数组)2.1.View(FreeMarker)渲染的全过程。
2.2.第一个简单的FreeMarker 尝试。
FreeMarker代码2.3.第二个简单的FreeMarker 尝试,Servlet Web方式展现。
FreeMarker代码3.FreeMarker 语法介绍。
Freemarker 基本语法是EL表达式,写法和在JSP里写法一致${},自身的语法是以<#tag>...</#tag>方式,也可以[#tag]方式。
以“?”作为自身方法调用,以“.”作为属性调用,下面我们来全面的介绍下。
3.1.FreeMarker注释。
每个View层都是有自己的注释方式,这个地方提到的注释不同于HTML的注释方式。
HTML注释方式在页面查看源码是看的到的。
而FreeMarker ,JSP等模版语言的注释都是查看页面源码看不见的。
其实建议我们在写代码的时候采用各种模版自身的注释方式来写注释,这样可以达到业务安全的效果。
3.2.自带空字符串(对象)处理。
从JSP等其他View层使用过的童鞋们,在使用FreeMarker的时候,都会遇到一个问题,当一个值或者对象为null的时候,如果这个时候去使用就会抛出异常。
freemarker利用详解

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会将>符号当做标签的终止字符,可能致使程序犯错,为了幸免这种情形,咱们应该在凡是显现这些符号的地址都利用括号.switch , case , default , break指令这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下:<#switch value><#case refValue>...<#break><#case refValue>...<#break><#default>...</#switch>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>include指令include指令的作用类似于JSP的包括指令,用于包括指定页.include指令的语法格式如下:<#include filename [options]>在上面的语法格式中,两个参数的说明如下:filename:该参数指定被包括的模板文件options:该参数能够省略,指定包括时的选项,包括encoding和parse两个选项,其中encoding指定包括页面时所用的解码集,而parse指定被包括文件是不是作为FTL文件来解析,若是省略了parse选项值,那么该选项默许是true.import指令该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下:<#import "/lib/" as com>上面的代码将导入/lib/模板文件中的所有变量,交将这些变量放置在一个名为com 的Map对象中.noparse指令noparse指令指定FreeMarker不处置该指定里包括的内容,该指令的语法格式如下:<#noparse>...</#noparse>看如下的例子:<#noparse><#list books as book><tr><td>${}<td>作者:${}</#list></#noparse>输出如下:<#list books as book><tr><td>${}<td>作者:${}</#list>escape , noescape指令escape指令致使body区的插值都会被自动加上escape表达式,但可不能阻碍字符串内的插值,只会阻碍到body内显现的插值,利用escape指令的语法格式如下:<#escape identifier as expression>...<#noescape>...</#noescape></#escape>看如下的代码:<#escape x as xhtml>First name:${firstName}Last name:${lastName}Maiden name:${maidenName}</#escape>上面的代码等同于:First name:${firstNamehtml}Last name:${lastNamehtml}Maiden name:${maidenNamehtml}escape指令在解析模板时起作用而不是在运行时起作用,除此之外,escape指令也嵌套利用,子escape继承父escape的规那么,如下例子:<#escape x as xhtml>Customer Name:${customerName}Items to ship;<#escape x as itemCodeToNameMap[x]>${itemCode1}${itemCode2}${itemCode3}${itemCode4}</#escape></#escape>上面的代码类似于:Customer Name:${customerNamehtml}Items to ship;${itemCodeToNameMap[itemCode1]html}${itemCodeToNameMap[itemCode2]html}${itemCodeToNameMap[itemCode3]html}${itemCodeToNameMap[itemCode4]html}关于放在escape指令中所有的插值而言,这此插值将被自动加上escape表达式,若是需要指定escape指令中某些插值无需添加escape表达式,那么应该利用noescape指令,放在noescape指令中的插值将可不能添加escape表达式.assign指令assign指令在前面已经利用了多次,它用于为该模板页面创建或替换一个顶层变量,assign指令的用法有多种,包括创建或替换一个顶层变量,或创建或替换多个变量等,它的最简单的语法如下:<#assignname=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指定了这种复杂变量值的用法,可是咱们也不要滥用这种用法,如下例子:<#assignx>Hello ${user}!</#assign>,以上代码改成如下写法更适合:<#assign x="Hello ${user}!"> setting指令该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:<#setting name=value>,在那个格式中,name的取值范围包括如下几个:locale:该选项指定该模板所用的国家/语言选项number_format:指定格式化输出数字的格式boolean_format:指定两个布尔值的语法格式,默许值是true,falsedate_format,time_format,datetime_format:指定格式化输出日期的格式time_zone:设置格式化输出日期时所利用的时区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> 外,还能够在概念自概念指令时,为自概念指令指定参数,看如下代码:<#macro book booklist> 书</@book >当利用nested指令传入变量值时,在利用该自概念指令时,就需要利用一个占位符(如book指令后的;x).上面的代码输出文本如下:1 .图书2 .图书在nested指令中利用循环变量时,能够利用多个循环变量,看如下代码:<#macro repeat count><#list 1..count as x> ${halfc}<#if last> Last! </#if></@repeat >上面的输出结果为:1. 2. 1 3. 4. 2 Last;return指令用于终止macro指令,一旦在macro指令中执行了return指令,则FreeMarker可不能继续处置macro指令里的内容,看如下代码:<#macro book>spring<#return>j2ee</#macro><@book />上面的代码输出:spring,而j2ee位于return指令以后,可不能输出.if, else, elseifswitch, case, default, breaklist, breakincludeImportcompressescape, noescapeassignglobalsettingmacro, nested, returnt, lt, rt2.插值:即${...}或#{...}格式的部份,将利用数据模型中的部份替代输出插值规那么FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}通用插值关于通用插值,又能够分为以下4种情形:1,插值结果为字符串值:直接输出表达式结果2,插值结果为数字值:依照默许格式(由#setting指令设置)将表达式结果转换成文本输出.能够利用内建的字符串函数格式化单个插值,如下面的例子:<#settion number_format="currency"/><#assign answer=42/>${answer}${answerstring} <#-- the same as ${answer} -->${answer}${answer}${answer}输出结果是:$ $ 42 $ 4,200%日期值插值结果为日期值:依照默许格式(由#setting指令设置)将表达式结果转换成文本输出.能够利用内建的字符串函数格式化单个插值,如下面的例子: ${lastUpdatedstring("yyyy-MM-dd HH:mm:ss zzzz")}输出结果是:2020-04-08 08:08:08 Pacific Daylight Time布尔值,插值结果为布尔值:依照默许格式(由#setting指令设置)将表达式结果转换成文本输出.能够利用内建的字符串函数格式化单个插值,如下面的例子:<#assign foo=true/>${foostring("yes", "no")}输出结果是:yes直接利用true和false,不利用引号.数字格式化差值数字格式化插值可采纳#{expr;format}形式来格式化数字,其中format能够是: mX:小数部份最小X位MX:小数部份最大X位如下面的例子:<#assign x=><#assign y=4/>#{x; M2} <#-- 输出-->#{y; M2} <#-- 输出4 -->#{x; m2} <#-- 输出-->#{y; m2} <#-- 输出-->#{x; m1M2} <#-- 输出-->#{x; m1M2} <#-- 输出-->表达式中的数值直接输出,不需要引号.小数点利用"."分隔,不能利用分组","符号1,数值不能省略小数点前面的0,因此".5"是错误的写法2,数值8 , +8 , 都是相同的特殊字符转义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\bar字符串操作FreeMarker的表达式对字符串操作超级灵活,能够将字符串常量和变量连接起来,也能够返回字符串的子串等.字符串联接有两种语法:1,利用${..}或#{..}在字符串常量部份插入表达式的值,从而完成字符串联接.2,直接利用连接运算符+来连接字符串例如有如下数据模型:Map root = new HashMap(); ("user","annlee");下面将user变量和常量连接起来:${"hello, ${user}!"} 值得注意的是,${..}只能用于文本部份,不能用于表达式,下面的代码是错误的:<#if ${isBig}>Wow!</#if><#if "${isBig}">Wow!</#if>应该写成:<#if isBig>Wow!</#if>截取子串能够依照字符串的索引来进行,截取子串时若是只指定了一个索引值,那么用于取得字符串中指定索引所对应的字符;若是指定两个索引值,那么返回两个索引中间的字符串子串.假设有如下数据模型:Map root = new HashMap(); ("book","struts2,freemarker");能够通过如下语法来截取子串:${book[0]}${book[4]} 4]} 2,!=:判定两个值是不是不等.3,>或gt:判定左侧值是不是大于右边值4,>=或gte:判定左侧值是不是大于等于右边值5,<或lt:判定左侧值是不是小于右边值6,<=或lte:判定左侧值是不是小于等于右边值注意:=和!=能够用于字符串,数值和日期来比较是不是相等,但=和!=两边必需是相同类型的值,不然会产生错误,而且FreeMarker是精准比较,"x","x ","X"是不等的.其它的运行符能够作用于数字和日期,但不能作用于字符串,大部份的时候,利用gt等字母运算符代替>会有更好的成效,因为FreeMarker会把>说明成FTL标签的终止字符,固然,也能够利用括号来幸免这种情形,如:<#if (x>y)>逻辑运算逻辑运算符有如下几个:逻辑与:&&逻辑或:||逻辑非:!逻辑运算符只能作用于布尔值,不然将产生错误内建函数例如字母转大小写首字母大写等FreeMarker还提供了一些内建函数来转换输出,能够在任何变量后紧跟,后紧跟内建函数,就能够够通过内建函数来轮换输出变量.下面是经常使用的内建的字符串函数: html:对字符串进行HTML编码cap_first:使字符串第一个字母大写lower_case:将字符串转换成小写upper_case:将字符串转换成大写trim:去掉字符串前后的空白字符下面是集合的经常使用内建函数size:获取序列中元素的个数下面是数字值的经常使用内建函数int:取得数字的整数部份,结果带符号例如:<#assign test="Tom & Jerry">${testhtml}${testupper_casehtml}结果是:Tom & Jerry TOM & JERRY空值处置运算符FreeMarker对空值的处置超级严格,FreeMarker的变量必需有值,没有被赋值的变量就会抛出异样,因为FreeMarker未赋值的变量强制犯错能够杜绝很多潜在的错误,如缺失潜在的变量命名,或其他变量错误.那个地址所说的空值,事实上也包括那些并非存在的变量,关于一个Java的null值而言,咱们以为那个变量是存在的,只是它的值为null,但关于FreeMarker模板而言,它无法明白得null值,null值和不存在的变量完全相同.为了处置缺失变量,FreeMarker提供了两个运算符:!:指定缺失变量的默许值:判定某个变量是不是存在其中,!运算符的用法有如下两种:variable!或variable!defaultValue,第一种用法不给缺失的变量指定默许值,说明默许值是空字符串,长度为0的集合,或长度为0的Map对象.利用!指定默许值时,并非要求默许值的类型和变量类型相同.利用运算符超级简单,它老是返回一个布尔值,用法为:variable,若是该变量存在,返回true,不然返回false2) 空值Null判定${ 加括号代表category, , 这三个都会进行判定; 不加括号只判定是不是为null<#if listexists && != 0 >空值判定:${if_exists },${default(‘xxx’)}事实上,咱们在开发进程中应该利用括号来严格区分,如此的可读性好,犯错少4.集合:list 对象<#list animals as being><li>${} for ${} Euros<br><#list>集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:<#list ["礼拜一", "礼拜二", "礼拜三", "礼拜四", "礼拜五", "礼拜六", "礼拜天"] as x> ${x}</#list>输出结果是:礼拜一礼拜二礼拜三礼拜四礼拜五礼拜六礼拜天若是需要输出集合元素,那么能够依照集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:["礼拜一","礼拜二","礼拜三","礼拜四","礼拜五","礼拜六","礼拜天"].该索引名为week,若是需要输出礼拜三,那么能够利用如下语法:${week[2]} 5] 5等同于[2, 3, 4, 5],可是更有效率.注意,利用数字范围来概念集合时无需利用方括号,数字范围也支持反递增的数字范围,5..2集合连接运算符那个地址所说的集合运算符是将两个集合连接成一个新的集合,连接集合的运算符是+,看如下的例子:<#list ["礼拜一","礼拜二","礼拜三"] + ["礼拜四","礼拜五","礼拜六","礼拜天"] as x>${x}</#list>输出结果是:礼拜一礼拜二礼拜三礼拜四礼拜五礼拜六礼拜天map对象利用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例子:{"语文":78, "数学":80}Map对象的key和value都是表达式,可是key必需是字符串2. FreeMarker的表达式输出变量时,这些变量能够是顶层变量,也能够是Map对象中的变量,还能够是集合中的变量,并能够利用点(.)语法来访问Java对象的属性.下面别离讨论这些情形1,顶层变量所谓顶层变量确实是直接放在数据模型中的值,例如有如下数据模型:Map root = new HashMap(); 了输出上面的name的值,能够利用如下语法: ${name}3.那个地址的Map对象能够是直接HashMap的实例,乃至包括JavaBean实例,关于JavaBean实例而言,咱们一样能够把其当做属性为key,属性值为value的Map 实例.为了输出Map元素的值,能够利用点语法或方括号语法.假设有下面的数据模型:Map root = new HashMap();Book book = new Book();Author author = new Author();("annlee");("gz");("struts2");(author);("info","struts");("book", book);为了访问数据模型中名为struts2的书的作者的名字,能够利用如下语法: ame["name"]map连接运算符Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+,若是两个Map对象具有相同的key,那么右边的值替代左侧的值.看如下的例子:<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>语文成绩是${scores.语文}数学成绩是${scores.数学}Java成绩是${}输出结果是:语文成绩是86数学成绩是87Java成绩是932. FTL指令规那么在FreeMarker中,利用FTL标签来利用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.1,开始标签:<#directivename parameter>2,终止标签:</#directivename>3,空标签:<#directivename parameter/>事实上,利用标签时前面的符号#也可能变成@,若是该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号.利用FTL标签时,应该有正确的嵌套,而不是交叉利用,这和XML标签的用法完全一样.若是全用不存在的指令,FreeMarker可不能利用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不许诺有空白字符.。
freemarker模板引擎 filter 方法

freemarker模板引擎 filter 方法Freemarker模板引擎——filter方法解析与应用1. 前言在Web开发领域,模板引擎是一个重要的工具,它可以将数据和页面结构进行分离,从而实现更好的代码组织和可维护性。
Freemarker作为一种强大而灵活的模板引擎,被众多开发者广泛使用。
本文将重点探讨Freemarker模板引擎中的filter方法,分析其用途和实际应用。
2. Freemarker模板引擎简介Freemarker是一款基于Java的模板引擎,旨在简化构建动态UI的过程。
它使用类似HTML的标记语法,通过预定义的指令和变量插值来生成最终的HTML、XML或其他文本输出。
作为一种非常流行的模板引擎,Freemarker提供了丰富的功能和灵活性,其中filter方法是其中一个重要的组成部分。
3. filter方法的定义与功能在Freemarker模板引擎中,filter方法用于对指定变量的值进行处理和转换,以满足特定需求。
它可以通过内置的或自定义的过滤器来实现对变量值的修改或增强。
通常,filter方法的格式如下:```${variableName?filterName}```其中,variableName表示需要处理的变量名,filterName表示所要应用的过滤器名。
通过使用filter方法,我们可以通过一条简洁的语句就完成了对变量值的转换,使得模板的编写更加简洁和易懂。
4. 内置过滤器的应用示例Freemarker模板引擎内置了许多常用的过滤器,可以直接在模板中进行使用。
下面是filter方法的几个常用过滤器实例:4.1 字符串截断过滤器```${article.content?truncate(100)}```上述代码中,我们通过truncate过滤器将article.content变量的值截断为最多100个字符的字符串,从而保证在输出时不会超出限定长度。
这样,无论内容长度如何,都能在页面上展示合适的文本长度。
FreeMarker?(三)

FreeMarker (三)71、chop_linebreak切断换行符72、date,time,datetime日期,时间,时间日期73、ends_with以…结尾74、html HTML格式的转义文本<用<替换;>用>替换;&用&替换;"用"替换;xhtml XHTML格式字符串作为XHTML格式文本输出,下面这些:<替换为<>替换为>&替换为&"替换为"'替换为'xml XML格式字符串作为XML格式文本输出,下面这些:<替换为<>替换为>&替换为&"替换为"'替换为'75、group分组76、index_of索引所在位置"abcabc"?index_of("bc", 2)会返回4。
77、last_index_of最后的索引所在位置 "abcabc"?last_index_of("ab", 2),将会返回078、length字符串长度79、lower_case小写形式80、left_pad距左边。
如果字符串的长度达到指定数值或者比指定的长度还长,那就什么都不做了。
81、right_pad距右边但是它从末尾开始插入字符而不是从开头82、contains包含 <#if"piceous"?contains("ice")>It contains "ice"</#if>输出It contains "ice"83、matches匹配决定字符串是否精确匹配上模式。
返匹配的子串列表。
返回值是一个多类型的值84、number数字格式字符串转化为数字格式。
FreeMarker指令

FreeMarker指令FreeMarker指令的组成:* 文本:直接输出的部分。
* 注释:即<#--...-->格式部分,不会输出。
* 插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出。
* FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。
1>.FTL指令规则:开始标签:<#directivename parameters>结束标签:</#directivename>空标签:<#directivename parameters/>注:如果某指令是一个用户自定义指令时,应将#符合改为@符合。
2>.插值规则:通用插值:${expr}数字格式化插值:#{expr}或#{expr,format}1>.介绍通用插值:${expr}* 插值结果为字符串值:直接输出表达式结果.* 插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出。
* 插值结果为日前值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出。
* 插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出。
例子1:<#setting number_format="currency"/><#assign answer=42/> //输出结果${answer} //$42.00${answer?string} //$42.00${answer?string.number} //42${answer?string.currency}//$42.00${answer?string.percent}//4,200%例子2:<#assign lastUpdate=42/>${lastUpdate?string("yyyy-MM-dd HH:mm:ss zzzz")}${lastUpdate?string("EEE,MMM d, ''yy")}${.................("EEEE,MMM dd,yyyy, hh:mm:ss a '('zzz')'")}输出结果如下:2003-04-08 21:24:44 Pacific Daylight TimeTue,Apr 8,'03Tuesday,April 08,2003,09:24:44 PM (PDT)例子3:<#assign foo=true/>${foo?string("yes","no")} //输出结果:yes2>介绍数字化插值mX:小数部分最小X位。
freemarker 模板引擎语法

Freemarker模板引擎是一种用于生成文本输出的模板引擎,它使用基于模板的方式来构建文档,支持条件判断、循环、宏定义等功能,适用于生成HTML、XML、JSON等文档,同时也可以用于邮件、配置文件等文本文件的生成。
Freemarker模板引擎的语法简单易懂,但功能强大,本文将对其语法进行详细介绍。
一、输出Freemarker模板引擎使用${...}语法来输出变量或表达式的值。
例如:```Hello, ${user}!```这段代码将会输出"Hello, "后跟变量user的值。
二、if语句Freemarker模板引擎支持使用if语句进行条件判断。
语法如下:```<#if condition>...<#elseif condition>...<#else>...</#if>其中,condition为一个布尔表达式。
当condition成立时,“...”内的内容会被输出。
三、list循环Freemarker模板引擎支持使用list进行循环。
语法如下:```<#list items as item>...</#list>```其中,items为一个列表,item为列表中的每个元素。
循环内的内容将会被item依次赋值后输出。
四、macro宏定义Freemarker模板引擎支持使用macro来定义宏。
语法如下:```<#macro myMacro param1 param2>...</#macro>```其中,myMacro为宏的名称,param1和param2为宏的参数。
定义完成后,可以通过<myMacro ...>来调用宏。
五、include包含文件Freemarker模板引擎支持使用include来包含其他文件。
语法如下:```<#include "header.ftl">...<#include "footer.ftl">```这段代码会将header.ftl和footer.ftl中的内容包含到当前文件中。
使用freemarker生成html、doc文件【原创】

使⽤freemarker⽣成html、doc⽂件【原创】语⾔:java功能:使⽤freemarker⽣成html、doc1、⽣成html1public void updateuseFreemarker2html(String abdkId) {2 // 要填⼊模本的数据⽂件3 Session session = sessionFactory.getCurrentSession();4 String hql = "from AbnmDktranssupervision as abnmDktranssupervision ";5 AbnmDktranssupervision result = null;6try {7// 根据id⽤hql语⾔获取⼀个对象的数据8 result = (AbnmDktranssupervision) session.get(9 AbnmDktranssupervision.class, Integer.parseInt(abdkId));10 } catch (Exception e) {11 e.printStackTrace();12 }13141516// 设置模本装置⽅法和路径,FreeMarker⽀持多种模板装载⽅法。
可以重servlet,classpath,数据库装载,17// 这⾥我们的模板是放在mon包下⾯18 configuration = new Configuration();19 configuration.setEncoding(Locale.CHINA, "utf-8");21 configuration.setClassForTemplateLoading(this.getClass(),22 "/cn/edu/bnu/land/common");23 Template t = null;2425try {26// freemarker2html.ftl为要装载的html模板27 t = configuration.getTemplate("freemarker2html.ftl");28 t.setEncoding("utf-8");29 } catch (IOException e) {30 e.printStackTrace();31 }323334// 输出⽂档路径及名称35 Calendar ca = Calendar.getInstance();36 Date date = ca.getTime();37 java.text.DateFormat format2 = new java.text.SimpleDateFormat(38 "yyyyMMddhhmmss");39 String dateString = format2.format(date);40//⽂件名称41 String m_fileName = result.getTbbh() + "_" + dateString + ".html";42//43 String realPath=this.getClass().getClassLoader().getResource("/").getPath();44 System.out.println(realPath);45int pos=realPath.indexOf("/WEB-INF");46 System.out.println(pos);47 realPath=realPath.substring(0, pos);48 realPath=realPath+"/Upload/abnmTransSupHtml/";49 System.out.println(realPath);50 String filePath = realPath +m_fileName;51 result.setAbdkFilepath("/tdlzJGXT/Upload/abnmTransSupHtml/"+m_fileName);535455 File outFile = new File(filePath);56 Writer out = null;57try {58 out = new BufferedWriter(new OutputStreamWriter(59new FileOutputStream(outFile), "utf-8"));60 } catch (Exception e1) {61 e1.printStackTrace();62 }6364try {65 t.process(result, out);66 out.close();67 } catch (TemplateException e) {68 e.printStackTrace();69 } catch (IOException e) {70 e.printStackTrace();71 }72 }7374 }freemarker3html.ftl1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns="/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">5 <title>异常交易预警信息</title>6 </head>7 8 <body> 9 <table>10 <tr><td>图斑编号:</td><td>${tbbh!"⽆"}</td></tr>11 <tr><td>图斑⾯积:</td><td>${tbmj!"⽆"}</td></tr>12 <tr><td>项⽬编号:</td><td>${xmbh!"⽆"}</td></tr>13 <tr><td>座落单位名称:</td><td>${zldwmc!"⽆"}</td></tr>14 <tr><td>地类名称:</td><td>${dlmc!"⽆"}</td></tr>15 <tr><td>⾏政区代码:</td><td>${xzqdm!"⽆"}</td></tr>16 <tr><td>转让⽅:</td><td>${abdkSeller!"⽆"}</td></tr>17 <tr><td>买⼊⽅:</td><td>${abdkBuyer!"⽆"}</td></tr>18 <tr><td>坡度:</td><td>${abdkSlope!"⽆"}</td></tr>19 <tr><td>坡度⽅差:</td><td>${abdkSlopevariance!"⽆"}</td></tr>20 <tr><td>交易前中⼼点x坐标:</td><td>${abdkBx!"⽆"}</td></tr>21 <tr><td>交易前中⼼点y坐标:</td><td>${abdkBy!"⽆"}</td></tr>22 <tr><td>交易后中⼼点x坐标:</td><td>${abdkAx!"⽆"}</td></tr>23 <tr><td>交易后中⼼点y坐标:</td><td>${abdkAy!"⽆"}</td></tr>24 <tr><td>交易前价格:</td><td>${abdkBprice!"⽆"}</td></tr>25 <tr><td>交易后⾯积:</td><td>${abdkAarea!"⽆"}</td></tr>26 <tr><td>交易后价格:</td><td>${abdkAprice!"⽆"}</td></tr>27 <tr><td>处理意见:</td><td>${abdkOpinion!"⽆"}</td></tr>28 <tr><td>是否处理:</td><td>${abdkIssolved!"⽆"}</td></tr>29 <tr><td>风险等级:</td><td>${abdkRisklevel!"⽆"}</td></tr>30 <tr><td>预警时间:</td><td>${abdkWarningtime!"⽆"}</td></tr>31 <tr><td>是否异常:</td><td>${abdkIsnormal!"⽆"}</td></tr>32 <tr><td>稻⾕产量:</td><td>${dgcl!"⽆"}</td></tr>33 <tr><td>稻⾕均价:</td><td>${dgjj!"⽆"}</td></tr>34 <tr><td>存储位置:</td><td>${abdkFilepath!"⽆"}</td></tr>35 </table>3637 </body> 38 </html>效果图:2、⽣成doc1// ues freemarker+xml to doc2public void updateuseFreemarker2doc(String abdkId) {3// 要填⼊模本的数据⽂件4 Session session = sessionFactory.getCurrentSession();5 String hql = "from AbnmDktranssupervision as abnmDktranssupervision ";6 AbnmDktranssupervision result = null;7try {8// System.out.println(hql);9 result = (AbnmDktranssupervision) session.get(10 AbnmDktranssupervision.class, Integer.parseInt(abdkId));11 } catch (Exception e) {12 e.printStackTrace();13 }14151617// 设置模本装置⽅法和路径,FreeMarker⽀持多种模板装载⽅法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FreeMarkerFreeMarker JavaFreeMarker HTML Web MVC FreeMarker Java FreeMarkerFreeMarker Web WebFreeMarker HTTP Servlet FreeMarker WebFreeMarker Model2 Struts JSPFreeMarker1HTML XML RTF JavaServletEmail Web Web2include if/elseif/elseHTML3FreeMarker Java JavaJavaBean XML SQL4 WebWeb HTMLModel2 Web JSPJSPMVC5UNICODEUS6 XML<#recurse> <#visit> 2.3 XMLXMLFreeMarker (1)11 + =FreeMarker—— HTML WebWebHTML FreeMarker<html><head><title>Welcome!</title></head><body><h1>Welcome ${user}!</h1><p>Our latest product:<a href="${latestProduct.url}">${}</a>!</body></html>HTML ${…} FreeMarker FreeMarker Template user latestProduct.url data model(root)|+- user = "Big Joe"|+- latestProduct|+- url = "products/greenmouse.html"|+- name = "green mouse"latestProduct user url name url name latestProductFreeMarker <html><head><title>Welcome!</title></head><body><h1>Welcome Big Joe!</h1><p>Our latest product:<a href="products/greenmouse.html">green mouse</a>!</body></html>2(root)|+- animals| || +- mouse| | || | +- size = "small" | | || | +- price = 50| || +- elephant| | || | +- size = "large" | | || | +- price = 5000| || +- python| || +- size = "medium" | || +- price = 4999|+- test = "It is a test"|+- whatnot|+- because = "don't know"hashesscalarsscalarsscalars root “. animals.mouse.pricesequences hashes(root)|+- animals| || +- (1st)| | || | +- name = "mouse"| | || | +- size = "small"| | || | +- price = 50| || +- (2nd)| | || | +- name = "elephant" | | || | +- size = "large"| | || | +- price = 5000| || +- (3rd)| || +- name = "python"| || +- size = "medium"| || +- price = 4999|+- whatnot|+- fruits|+- (1st) = "orange"|+- (2nd) = "banana"scalars animals[0].name3FreeMarker${…} interpolations FreeMarkerFTL FreeMarker HTML HTML # @<#-- --> <!-- -->if<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today.<#else>Pythons are not cheaper than elephants today.</#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<html><head><title>Test page</title></head><body><h1>Test page</h1><p>Blah blah...<#include "/copyright_footer.html"> </body></html><p>We have these animals:<table border=1><tr><th>Name<th>Price<#list animals as being><tr><td><#if being.size = "large"><b></#if>${}<#if being.size = "large"></b></#if><td>${being.price} Euros</#list></table>FreeMarker (3)31FTL FreeMarkerInterpolation ${ } #{ }FTL FreeMarker HTML #<#-- --><html>[BR]<head>[BR]<title>Welcome!</title>[BR]</head>[BR]<body>[BR]<#-- Greet the user with his/her name -->[BR]<h1>Welcome ${user}!</h1>[BR]<p>We have these animals:[BR]<ul>[BR]<#list animals as being>[BR]<li>${} for ${being.price} Euros[BR]</#list>[BR]</ul>[BR]</body>[BR]</html>[BR]FTL list FTL List ${name} ${NAME}InterpolationFTL FTL<#if <#include 'foo'>='bar'>...</if>FTL Interpolation<h1>Welcome ${user <#-- The name of user -->}!</h1>[BR]<p>We have these animals:[BR]<ul>[BR]<#list <#-- some comment... --> animals as <#-- again... --> being>[BR] ...2FreeMarker FTLFTL HTML<#directivename parameters></#directivename><#directivename parameters/>@ # <@mydirective>...</@mydirective>FTL <ul><#list animals as being><li>${} for ${being.price} Euros<#if use = "Big Joe">(except for you)</#list></#if><#-- WRONG! --></ul>FreeMarkerFreeMarker FTL <#list[BR]animals as[BR]being[BR]>[BR]${} for ${being.price} Euros[BR]</#list >< </3${"It's \"quoted\" andthis is a backslash: \\"}${'It\'s "quoted" andthis is a backslash: \\'}It's "quoted" andthis is a backslash: \It's "quoted" andthis is a backslash: \\" (u0022)\' (u0027)\\ (u005C)\n (u000A)\r Return (u000D)\t Tab (u0009)\b Backspace (u0008)\f Form feed (u000C)\l<\g>\a&\{{\x Code4 16 Unicoderaw \ { r ${r"${foo}"}${r"C:\foo\bar"}${foo}C:\foo\bar“.“1E30 “.58 +8 08 8.00true false<#list ["winter", "spring", "summer", "autumn"] as x>${x}</#list>winterspringsummerautumn[2 + 2, [1, 2, 3, 4], "whatnot"]2..5 [2, 3, 4, 5]5..2hash/{"name":"green mouse", "price":150}${variable} $ @ #(root)|+- book| || +- title = "Breeding green mouses"| || +- author| || +- name = "Julia Smith"| || +- info = "Biologist, 1923-1985, Canada"|+- test = "title"book["author"].namebook.author.["name"]book["author"]["name"][startIndex..endIndex] startIndex endIndexFreeMarker .variablenameInterpolation${..} #{..} ${"Hello ${user}!"}${"${user}${user}${user}${user}"}+${"Hello " + user + "!"}${user + user + user + user}${..}<#if ${isBig}>Wow!</#if><#if "${isBig}">Wow!</#if><#if isBig>Wow!</#if>user “Big Joe ${user[0]}${user[4]}${user[1..4]}BJig J+ <#list ["Joe", "Fred"] + ["Julia", "Kate"] as user> - ${user}</#list>- Joe- Fred- Julia- Kate+ key <#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>- Joe is ${ages.Joe}- Fred is ${ages.Fred}- Julia is ${ages.Julia}- Joe is 30- Fred is 25- Julia is 18${x * x - 100}${x / 2}${12 % 10}x 5-752.52${3 * "5"} <#-- WRONG! -->+ ${3 + "5"}35int${(x/2)?int}${1.1?int}${1.999?int}${-1.1?int}${-1.999?int}x 5211-1-1= == !== != <#if 1 = "1">Freemarker "x" "x " "X"< <= > >=Freemarker > FTL > >= <#if (x > y)>lt lte gt gte < <= > >=&& and || or ! not<#if x < 12 && color = "green">We have less than 12 things, and they are green.</#if><#if !hot> <#-- here hot must be a boolean -->It's not hot.</#if>“? “.html HTMLcap_firstlower_caseupper_casetrimsizeint -1.9?int -1 test "Tom & Jerry"${test?html}${test?upper_case?html}Tom & JerryTOM & JERRY[subvarName] [subStringRange]. (methodParams) +expr -expr !?* / %+ -< > <= >= lt lte gt gte== = !=and &&or ||..4 InterpolationInterpolationInterpolation ${expr}Interpolation #{expr} #{expr; format}InterpolationInterpolation#setting string Interpolation <#setting number_format="currency"/><#assign answer=42/>${answer}${answer?string} <#-- the same as ${answer} -->${answer?string.number}${answer?string.currency}${answer?string.percent}$42.00$42.0042$42.004,200%#setting string Interpolation ${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')'")}2003-04-08 21:24:44 Pacific Daylight TimeTue, Apr 8, '03Tuesday, April 08, 2003, 09:24:44 PM (PDT)#settingstring Interpolation<#assign foo=true/>${foo?string("yes", "no")}yesInterpolation #{expr; format} format mX XMX X<#-- If the language is US English the output is: --><#assign x=2.582/><#assign y=4/>#{x; M2} <#-- 2.58 -->#{y; M2} <#-- 4 -->#{x; m1} <#-- 2.6 -->#{y; m1} <#-- 4.0 -->#{x; m1M2} <#-- 2.58 -->#{y; m1M2} <#-- 4.0 -->FreeMarker (4)41macro<#macro greet><font size="+2">Hello Joe!</font></#macro>@ FTL #<@greet></@greet><@greet/>macro<#macro greet person><font size="+2">Hello ${person}!</font></#macro><@greet person="Fred"/> and <@greet person="Batman"/><font size="+2">Hello Fred!</font>and <font size="+2">Hello Batman!</font>FTL<@greet person=Fred/>Fred person<#macro greet person color><font size="+2" color="${color}">Hello ${person}!</font></#macro><@greet person="Fred" color="black"/><@greet color="black" person="Fred"/>macro <@greet person="Fred" color="black" background="green"/><@greet person="Fred"/><#macro greet person color="black"><font size="+2" color="${color}">Hello ${person}!</font></#macro><@greet person="Fred"/><#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><#macro do_thrice><#nested><#nested><#nested></#macro><@do_thrice>Anything.</@do_thrice>Anything.Anything.Anything.FTL <@border><ul><@do_thrice><li><@greet person="Joe"/></@do_thrice></ul></@border><table border=4 cellspacing=0 cellpadding=4><tr><td> <ul><li><font size="+2">Hello Joe!</font><li><font size="+2">Hello Joe!</font><li><font size="+2">Hello Joe!</font></ul></tr></td></table><#macro repeat count><#local y = "test"><#list 1..count as x>${y} ${count}/${x}: <#nested></#list></#macro><@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat>test 3/1: ? ? ?test 3/2: ? ? ?test 3/3: ? ? ?nested <@…><#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></@repeat>1. 0.52. 13. 1.54. 2 Last!2plain include assignlocallistplain plain<#assign x = "plain">1. ${x} <#-- we see the plain var. here --><@test/>6. ${x} <#-- the value of plain var. was not changed --><#list ["loop"] as x>7. ${x} <#-- now the loop var. hides the plain var. --><#assign x = "plain2"> <#-- replace the plain var, hiding does not materhere -->8. ${x} <#-- it still hides the plain var. --></#list>9. ${x} <#-- the new value of plain var. --><#macro test>2. ${x} <#-- we still see the plain var. here --><#local x = "local">3. ${x} <#-- now the local var. hides it --><#list ["loop"] as x>4. ${x} <#-- now the loop var. hides the local var. --></#list>5. ${x} <#-- now we see the local var. again --></#macro>1. plain2. plain3. local4. loop5. local6. plain7. loop8. loop9. plain2<#list ["loop 1"] as x>${x}<#list ["loop 2"] as x>${x}<#list ["loop 3"] as x>${x}</#list>${x}</#list>${x}</#list>loop 1loop 2loop 3loop 2loop 1global user Big Joe<#assign user = "Joe Hider">${user} <#-- prints: Joe Hider -->${er} <#-- prints: Big Joe -->3lib/my_test.ftl<#macro copyright date><p>Copyright (C) ${date} Julia Smith. All rights reserved.<br>Email: ${mail}</p></#macro><#assign mail = "jsmith@">import Freemarker import<#import "/lib/my_test.ftl" as my><#assign mail="fred@"><@my.copyright date="1999-2002"/>${my.mail}${mail}<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.<br>Email: jsmith@</p>jsmith@fred@assign <#import "/lib/my_test.ftl" as my>${my.mail}<#assign mail="jsmith@" in my>${my.mail}jsmith@jsmith@<#macro copyright date><p>Copyright (C) ${date} ${user}. All rights reserved.</p></#macro><#assign mail = "${user}@">user Fred<#import "/lib/my_test.ftl" as my><@my.copyright date="1999-2002"/>${my.mail}<p>Copyright (C) 1999-2002 Fred. All rights reserved.</p> Fred@。