Bootstrap

FreeMarker的基础知识整理

1、Freemarker概念

Freemarker不是web开发的应用程序框架,它是适用于web应用程序框架中的组件。

    FreeMarker引擎本身不知道HTTP协议或者Java Servlet的存在。所以它也可以用于非   web应用程序的开发环境

 

2、模板+数据模型 输出

*模板:

        静态的HTML代码+FreeMarker指令元素

    *数据模型:

              来自java对象

    *输出:

          模板存放在web服务器上,当有人来访问这个页面时,FreeMarker将会动转换   模板,生成普通的HTML文本并发送结果到访问者的Web浏览器中去显示

 

3、变量:

       1)哈希表变量

可以访问子变量名称

          *指定值:

    {"name":"mouse","age":128},键的类型为字符串,如  "name","age"

          *检索:

                 hash.name,hash.age

          *连接:

  使用+来连接两个哈希表,如果两个哈希表含有相同键的项,

                          那么+右侧的哈希表中的项优先

                  <#assign ages = {"joe":23,"fred":24}+{"joe":20,"julia":30}>

                          最后ages.joe=20

       2)序列变量

                  按顺序存储子变量,使用数字索引访问子变量

            *指定值:

  ["foo","bar",123]

            *检索:

seq[5]

    *切分:

seq[firstindex..lastindex]

                        seq[10..19]表达式会是包含第11个至第20个元素的序列, lastindex可以省略,这样seq[10..]表示包含第11个至最后一个 元素的序列

       

 

       3)标量

    仅存储单值的变量

             *字符串:

     *指定值:

 "aaa"或者'aaa'

                     *检索:

   获取一个字符name[0]

         *连接:

   "aaa"+"bbb"

         *原生字符串:

            一些特殊的符号没有特殊意义,前面加r

                 例如${r"${foo}"}会打印${foo}

             *数字:

                   *指定值:

   123.45

             *日期/时间:

                       *指定值:

             *布尔值:

 *指定值:

 true,false

       

6、在模板中要访问子变量,需要从根开始指定路径,每级用点来分隔。

 

7FreeMarker模板(FTL)的特殊部分:

      1)插值:

         ${表达式}

              *使用:

                *文本:

  <h1>Hello ${name}!</h1>

                *字符串:

<#include "/footer/${company}.html">

          *表达式的结果

                *字符串插值:

                            当插值在文本区,放在escapse指令中,被插 入的字符串(HTML)会被自动转义

                            <#escape x as x?html>

                            <p>${book}</p><!--&会被转义为&>

                            <p><#noescape>${pencil}</#noescape></p>

                                </#escape>

        *数字插值:

    使用number_format设置格式

    使用string重写默认格式

 

 

        *日期/时间插值:

   使用time_format,date_format,datetime_format  设置转换格式

   使用string重写默认格式

        *布尔插值:

    布尔类型的变量不能直接放进${}中,需要   ${user?string("yes","no")}

 

      2FTL标签(指令):

                  以#符号开头,自定义的标签以@开头,

                  标签不可以在其他标签和插值中使用

 

      3)注释:

              <#---->可以放在标签和插值中间

              ${user<#--the name-->}

             <#list <#--some comment-->>

 

8、指令:

       1if指令:

                 <#if condition>...</if>

                 当condition条件为false时,if标签之间的内容会被忽略

       2if else指令:

                    <#if condition>

                      aaaaaaaa;

                    <#else>

                      bbbbbbb;

                    </#if>

                    使用<#else>标签可以指定conditionfalse时执行的程序

       3list指令:

                  <#list sequence as loopVariable>

                     语句;

                  </#list>

       4)include指令:

                    <#include "aaa.html">

 

9、处理不存在的变量:(变量不存在或者为null

       1)指定默认值:

                     ${(bianliang ! "aaa")}

                     当bianliang不存时指定bianliang="aaa",最好是使用括号,

                 如果默认值被省略了,那么结果将会是空串,空序列或空哈希表,

                 但是如果想让默认值为0或者false,则需要指定,不能省略。

                     多级访问变量问题:

                      1animals.pig.price!0

                         animalspig变量都需要存在才会给price赋默认值,

                         否则程序报错

                      2(animals.pig.price)!0

                         animalspig变量不存在时表达式结果也为0

 

       2if询问:

                 <#if bianliang??>               

 

10、方法和函数:

               方法来自于数据模型(反射了java对象的方法)

               函数是定义在模板里的,使用函数指令

11、算数运算:

            *加法:+

        *减法:-

        *乘法:*

        *除法:/

        *求模(求余):%

 

12、比较运算:

            比较运算两边的表达式结果为数字类型

        *相等:=

        *不等:!=

                <   (lt)

           <=  (lte)

            >   (gt)

            >=  (gte)

          *但是<>需要放在()中,否则和FTL标签冲突

 

13、逻辑操作:

         逻辑操作两边的表达式结果为布尔类型

         *逻辑或:||

         *逻辑与:&&

         *逻辑非:!

 

14、内建函数:

         内建函数提供变量的不同形式和其它信息。

           *字符串使用的内建函数:

                   *html:

                                       字符串中所有的特殊HTML字符都需要用实       体引用来代替。

                   *cap_first:

       第一个字母变为大写。

                   *lower_case:

 字符串小写形式。

                    

*upper_case:

 字符串大写形式。

                    *trim:

去掉字符串首尾的空格。

                    *string:

 设置输出格式。

          *序列使用的内建函数:

                  Size:

  序列中元素的个数。

          *数字使用的内建函数:

                  int:

 数字的整数部分。

 

15、模板中定义的变量:

             *简单变量:

       能从模板中的任何位置来访问,或者从使用include指令      引入的模板访问。

                   可以使用assignmacro指令来创建或替换这些变量

                       *创建变量:

 <#assign x=1>

                   *替换变量:

 <#assign x=x+3>

 

      *局部变量:

                      设置在宏定义体内,只在宏内可见。生存周期只是宏的    调用过程。可以使用local指令在宏定义体内创建或者替    换局部变量

 

     *循环变量:

  由指令(list)自动创建,只在指令的开始和结束标记内     有效。

 

     *隐藏变量:

         *模板中定义的变量隐藏数据模型中的变量

         *局部变量隐藏同名的简单变量

         *循环变量隐藏同名的局部变量和简单变量

         *内部循环变量隐藏外部循环变量 

         <#assign x="aaa">

            ${x}                  <#--普通变量-->

                  <#list["loop"] as x>

                   ${x}              <#--循环变量-->

               <#assign x="bbb">  <#--普通变量-->

           ${x}              <#--循环变量-->

              </#list>

              ${x}                   <#--普通变量-->

                       <#local x="local">

                            ${x}              <#--局部变量-->

                        <#list ["loo"] as x>

${x}          <#--循环变量x-->

       </#list>

       ${x}              <#--局部变量-->

         </#local>

 

 

 

 

 

 

 

;