最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

freemark基础

来源:动视网 责编:小OO 时间:2025-09-27 11:32:08
文档

freemark基础

FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等。FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:1,文本:直接输出的部分2,注释:格式部分,不会输出3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出4,
推荐度:
导读FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等。FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:1,文本:直接输出的部分2,注释:格式部分,不会输出3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出4,
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 

1,文本:直接输出的部分 

2,注释:<#-- ... -->格式部分,不会输出 

3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 

4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 

下面是一个FreeMarker模板的例子,包含了以上所说的4个部分 



Welcome!



<#-- 注释部分 -->

<#-- 下面使用插值 -->

Welcome ${user} !


We have these animals:


<#-- 使用FTL指令 -->

<#list animals as being>

  • ${being.name} for ${being.price} Euros

    <#list>



    1, FTL指令规则 

    在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的. 

    1,开始标签:<#directivename parameter>

    2,结束标签:

    3,空标签:<#directivename parameter/>

    实际上,使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号. 

    使用FTL标签时, 应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样.如果全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符. 

    2, 插值规则 

    FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} 

    4 FreeMarker的常用指令 

    FreeMarker的FTL指令也是模板的重要组成部分,这些指令可实现对数据模型所包含数据的抚今迭代,分支控制.除此之外,还有一些重要的功能,也是通过FTL指令来实现的. 

    3.2 输出变量值 

    FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况 

    1,顶层变量 

    所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型: 

    Map root = new HashMap();   //创建数据模型 

    root.put("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

    root.put("book", book); 

    为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法: 

    book.author.name    //全部使用点语法 

    book["author"].name 

    book.author["name"]    //混合使用点语法和方括号语法 

    book["author"]["name"]   //全部使用方括号语法 

    使用点语法时,变量名字有顶层变量一样的,但方括号语法没有该,因为名字可以是任意表达式的结果. 

    3.3, 字符串操作 

    FreeMarker的表达式对字符串操作非常灵活,可以将字符串常量和变量连接起来,也可以返回字符串的子串等. 

    字符串连接有两种语法: 

    1,使用${..}或#{..}在字符串常量部分插入表达式的值,从而完成字符串连接. 

    2,直接使用连接运算符+来连接字符串 

    例如有如下数据模型: 

    Map root = new HashMap(); root.put("user

    下面将user变量和常量连接起来: 

    ${"hello, ${user}!"}   //使用第一种语法来连接 

    ${"hello, " + user + "!"} //使用+号来连接 

    上面的输出字符串都是hello,annlee!,可以看出这两种语法的效果完全一样. 

    值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的: 

    <#if ${isBig}>Wow!

    <#if "${isBig}">Wow!

    应该写成:<#if isBig>Wow!

    截取子串可以根据字符串的索引来进行,截取子串时如果只指定了一个索引值,则用于取得字符串中指定索引所对应的字符;如果指定两个索引值,则返回两个索引中间的字符串子串.假如有如下数据模型: 

    Map root = new HashMap(); root.put("book

    可以通过如下语法来截取子串: 

    ${book[0]}${book[4]}   //结果是su 

    ${book[1..4]}     //结果是tru 

    3.4 集合连接运算符 

    这里所说的集合运算符是将两个集合连接成一个新的集合,连接集合的运算符是+,看如下的例子: 

    <#list ["星期一星期二星期三"] + ["星期四星期五星期六星期天"] as x>

    ${x} 

    输出结果是:星期一 星期二 星期三 星期四 星期五 星期六 星期天 

    3.5 Map连接运算符 

    Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子: 

    <#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>

    语文成绩是${scores.语文} 

    数学成绩是${scores.数学} 

    Java成绩是${scores.Java} 

    输出结果是: 

    语文成绩是86 

    数学成绩是87 

    Java成绩是93 

    4.1 if指令 

    这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: 

    <#if condition>...

    <#elseif condition>...

    <#elseif condition>...

    <#else> ...

    例子如下: 

    <#assign age=23>

    <#if (age>60)>老年人 

    <#elseif (age>40)>中年人 

    <#elseif (age>20)>青年人 

    <#else> 少年人 

    输出结果是:青年人 

    上面的代码中的逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号. 

    4.2 switch , case , default , break指令 

    这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下: 

    <#switch value>

    <#case refValue>...<#break>

    <#case refValue>...<#break>

    <#default>...

    4.3 list, break指令 

    list指令是一个迭代输出指令,用于迭代输出数据模型中的集合,list指令的语法格式如下: 

    <#list sequence as item>

    ... 

    上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量: 

    item_index:当前变量的索引值 

    item_has_next:是否存在下一个对象 

    也可以使用<#break>指令跳出迭代 

    例子如下: 

    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>

    ${x_index + 1}.${x}<#if x_has_next>,

    <#if x="星期四"><#break>

    4.4 include指令 

    include指令的作用类似于JSP的包含指令,用于包含指定页.include指令的语法格式如下: 

    <#include filename [options]>

    在上面的语法格式中,两个参数的解释如下: 

    filename:该参数指定被包含的模板文件 

    options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true. 

    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指令的内容赋值给name变量.如下例子: 

    <#assign x>

    <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>

    ${n} 

    ${x} 

    上面的代码将产生如下输出:星期一 星期二 星期三 星期四 星期五 星期六 星期天 

    虽然assign指定了这种复杂变量值的用法,但是我们也不要滥用这种用法,如下例子:<#assign x>Hello ${user}!,以上代码改为如下写法更合适:<#assign x="Hello ${user}!">

    4.9 setting指令 

    该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:<#setting name=value>,在这个格式中,name的取值范围包含如下几个: 

    locale:该选项指定该模板所用的国家/语言选项 

    number_format:指定格式化输出数字的格式 

    boolean_format:指定两个布尔值的语法格式,默认值是true,false 

    date_format,time_format,datetime_format:指定格式化输出日期的格式 

    time_zone:设置格式化输出日期时所使用的时区 

    4.10 macro , nested , return指令 

    macro可以用于实现自定义指令,通过使用自定义指令,可以将一段模板片段定义成一个用户指令,使用macro指令的语法格式如下: 

    <#macro name param1 param2 ... paramN>

    ... 

    <#nested loopvar1, loopvar2, ..., loopvarN>

    ... 

    <#return>

    ... 

    在上面的格式片段中,包含了如下几个部分: 

    name:name属性指定的是该自定义指令的名字,使用自定义指令时可以传入多个参数 

    paramX:该属性就是指定使用自定义指令时报参数,使用该自定义指令时,必须为这些参数传入值 

    nested指令:nested标签输出使用自定义指令时的中间部分 

    nested指令中的循环变量:这此循环变量将由macro定义部分指定,传给使用标签的模板 

    return指令:该指令可用于随时结束该自定义指令. 

    看如下的例子: 

    <#macro book> //定义一个自定义指令 

    j2ee 

    <@book /> //使用刚才定义的指令 

    上面的代码输出结果为:j2ee 

    在上面的代码中,可能很难看出自定义标签的用处,因为我们定义的book指令所包含的内容非常简单,实际上,自定义标签可包含非常多的内容,从而可以实现更好的代码复用.此外,还可以在定义自定义指令时,为自定义指令指定参数,看如下代码: 

    <#macro book booklist> //定义一个自定义指令booklist是参数 

    <#list booklist as book>

       ${book} 

    <@book booklist=["spring使用刚刚定义的指令 

    上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee 

    不仅如此,还可以在自定义指令时使用nested指令来输出自定义指令的中间部分,看如下例子: 

    <#macro page title>

    FreeMarker示例页面 - ${title?html}

    ${title?html}

    <#nested> //用于引入用户自定义指令的标签体 

    上面的代码将一个HTML页面模板定义成一个page指令,则可以在其他页面中如此page指令: 

    <#import "/common.ftl" as com> //假设上面的模板页面名为common.ftl,导入页面 

    <@com.page title="book list">

  • spring
  • j2ee
  • 从上面的例子可以看出,使用macro和nested指令可以非常容易地实现页面装饰效果,此外,还可以在使用nested指令时,指定一个或多个循环变量,看如下代码: 

    <#macro book>

    <#nested 1> //使用book指令时指定了一个循环变量值 

    <#nested 2>

    <@book ;x> ${x} .图书

    当使用nested指令传入变量值时,在使用该自定义指令时,就需要使用一个占位符(如book指令后的;x).上面的代码输出文本如下: 

    1 .图书    2 .图书 

    在nested指令中使用循环变量时,可以使用多个循环变量,看如下代码: 

    <#macro repeat count>

    <#list 1..count as x> //使用nested指令时指定了三个循环变量 

    <#nested x, x/2, x==count>

    <@repeat count=4 ; c halfc last>

    ${c}. ${halfc}<#if last> Last!

    上面的输出结果为: 

    1. 0.5   2. 1   3. 1.5   4. 2 Last; 

    return指令用于结束macro指令,一旦在macro指令中执行了return指令,则FreeMarker不会继续处理macro指令里的内容,看如下代码: 

    <#macro book>

    spring 

    <#return>

    j2ee 

    <@book />

    上面的代码输出:spring,而j2ee位于return指令之后,不会输出. 

    文档

    freemark基础

    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等。FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:1,文本:直接输出的部分2,注释:格式部分,不会输出3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出4,
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top