zoukankan      html  css  js  c++  java
  • Freemarker-标签使用

     FreeMarker标签使用 

    FreeMarker模板文件主要有4个部分组成

      1、文本,直接输出的部分
      2、注释,即<#--...-->格式不会输出
      3、插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出
      4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。

    FTL指令规则 

     FreeMarker有三种FTL标签,这和HTML的标签是完全类似的

      开始标签:<#directivename parameters>
      结束标签:</#directivename>
      空标签: <#directivename parameters />

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

    插值规则

     FreeMarker的插值有如下两种类型

     1、通用插值:${expr}
     2、数字格式化插值:#{expr}或者#{expr;format}

      通用插值,有可以分为四种情况

      a、插值结果为字符串值:直接输出表达式结果
        b、插值结果为数字值:根据默认格式(#setting 指令设置)将表达式结果转换成文本输出。可以使用内建的字符串函数格式单个插值,例如

    <#setting number_format = "currency" />
           <#assign price = 42 />
           ${price}
           ${price?string}
           ${price?string.number}
           ${price?string.currency}
           ${price?string.percent}

      c、输出值为日期值:根据默认格式(由 #setting 指令设置)将表达式结果转换成文本输出,可以使用内建的字符串函数格式化单个插值,例如    

    <#assign lastUpdated = "2009-01-07 15:05"?datetime("yyyy-MM-dd HH:mm") />
          ${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')'")};
          ${lastUpdated?string.short};
          ${lastUpdated?string.long};
          ${lastUpdated?String.full};

       d、插值结果为布尔值

    <#assign foo=true />
    ${foo?string("是foo","非foo")}

       数字格式化插值
         数字格式化插值可采用#{expr;format}的形式来格式化数字,其中format可以是:
         mX:小数部分最小X位
         MX:小数部分最大X位
         例如:

    <#assign x = 2.582 />
            <#assign y =4 />
            #{x;M2};
            #{y;M2};
            #{x;m1};
            #{y;m1};
            #{x;m1M2};
            #{y:m1M2};

    表达式

    表达式是FreeMarker的核心功能。表达式放置在插值语法(${...})之中时,表面需要输出表达式的值,表达式语法也可以与FreeMarker标签结合,用于控制输出

      1、直接指定值
          例如:

    a、字符串
             ${'我的名字是"yeek"'};
             ${"我的文件保存在d:\盘"};
          b、数值
          c、布尔值
          d、日期型
             FreeMarker支持date、time、datetime三种类型,这三种类型的值无法直接指定,通常需要借助字符串的date、time、datetime三个内建函数进行转换才可以
    
               <#assign test1 = "2009-01-22"?date("yyyy-MM-dd") />;
               <#assign test2 ="16:34:43"?time("HH:mm:ss") />
               <#assign test2 = "2009-01-22 17:23:45"?datetime("yyyy-MM-dd HH:mm:ss") />
               ${test1?string.full}
    
          e、集合
            集合以方括号包括,各集合元素之间以英文逗号(,)分隔,看如下的示例:
    
           <#list["星期一",,["星期二",["星期三",["星期四",["星期五"] as x>
             ${s};
            </#list>
    
          f、Map集合
             Map对象使用花括号包括,Map中的key-value对之间以英文冒号(:)隔开,多组key-value对之间以英文逗号(,) 隔开
               例如
    
               <#assign score = {"语文":78,"数学":83,"Java":89} >
                 <#list score?key as x>
                  ${x}--->${score[x]};
               </#list>

    2、输出变量值

    FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性
              a、顶层变量
                 Map root = new HashMap();
                 root.put("name","wenchao");
                 对应顶层变量,直接使用${variableName}来输出变量值,变量名只能是数字、字母、下划线、$、@和#的组合,并不能以数字开头
              b、输出集合元素
                 如果需要输出集合元素,则可以根据集合元素的索引来输出元素。集合元素的索引以方括号指定。
                 假设有集合对象为:["星期一","星期二","星期三","星期四","星期五","星期六"],该集合对象名为week, 如果需要输出星期三,则可以使用如下语法:
                    ${week[2]}
                 集合里的第一个元素的索引是0
              c、输出Map元素
                  这里的Map对象可以是直接HashMap的实例,甚至包括 JavaBean实例,对应JavaBean实例,我们一样可以把其当成属性为key,属性为value的Map实例

    3、字符串操作

    a、字符串链接
         字符串连接有两种语法
               A、使用${..}(或#{..})在字符串常量部分插入表达式的值,从而完成字符串连接
               B、直接使用连接运算符(+)来连接字符串
                 使用第一种语法来连接字符串
                 ${"Hello,${user}!"}
                  第二种使用连接符号来连接字符串
                 ${"Hello,"+user+"!"};
                   值的注意的是,${..}只能用于文本部分,因此,下面的代码是错误的:
                     <#if ${isBig}>Wow!</#if>
                     <#if "${isBig}">Wow!</#if>
                     应该写成:
                     <#if isBig>Wow!</#if>
             
      b、截取字符串
                Map root = new HashMap();
                root.put("book","疯狂Ajax讲义");
                ${book[0]}
                ${book[4]}
                ${book[1..4]}

      4、集合连接运算符
            这里所说的集合连接运算时将两个集合连接成一个新的集合,连接集合的运算符是+,例如

    <#list ["星期一"," 星期二","星期三"]+["星期四","星期五"] as x>
               ${x}
            </#list>

       5、Map连接运算符
                 Map对象的连接运算也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+。如果两个Map对象具有相同的 key,则后加入Map里的key所对应的value替代原来key所对应的value
             
          6、算术运算符
             FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括: +,-,*,/,%
             看如下代码示范;

    <#assign x = 5 />
               ${x* -100}
               ${x/2}
               ${12%10}

      在表达式中使用算术运算时要注意以下几点。

    A、运算符两边的运算数必须是数字,因此下面的代码是错误的:
               ${3*"5"}
             B、使用+(既可以作为加号,也可以作为字符串连接运算符)运算时,如果一边是数字,一边是字符串,就会自动将数字转化为字符串。例如
                ${3+"5"}
                输出结果:35
             C、使用内建的int函数可对数值取整。例如
                <#assign x = 5>
                ${(x/2)?int}
                ${1.1?int}
                ${1.999?int}
                ${-1.9999?int}
                ${-1.1?int}

          7、比较运算符
               表达式中支持的比较运算符有如下几个

    a、=(或者==):判断两个值是否相等.
               b、!=:判断两个值是否不相等
               c、 >(或者gt):判断坐标值是否大于右边值
               d、 >=(或者gte):判断坐标值是否大于等于右边值
               e、 <(或者lt):判断左边值是否小于右边值
               f、 <=(或者lte):判断左边值是否小于等于右边值

    8、逻辑运算符
              逻辑运算符有如下几个

     a、逻辑与:&&
     b、逻辑或:||
    c、逻辑非:!

    逻辑运算符只能作用于布尔值,否则将产生错误。
              
           9、内建函数
              FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可通过内建函数来转换输出变量
              下面是常用的内建的字符串函数

       

      a、html:对字符串进行HTML编码
      b、cap_first:将字符串第一个字母成大写
      c、lower_case:将字符串转换成小写
      d、upper_case:将字符串转换成大写
      e、trim: 去掉字符串前后的空白字符

    下面是集合的常用的内建函数

     a、size: 获得序列中元素的数目

    下面是数字值的常用的内建函数

    a、int 取得数字的整数部分
    例如
    <#assign test="Tom & Jerry" />
     ${test?html}
     ${test?upper_case?html}

    10、空值处理运算符
              FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常。
     
     11、运算符优先级

    FreeMarker 的常用指令

    语法格式如下
           <#if condition>
                ....
           <#elseif condition2>
              ...
           <#elseif condition3>      
              ...
           <#else>
              ...
           </#if>

    if

    1. 判断对象是否存在(null)

    经常会用到,如果对象 != null 则xxxx,在freemarker中表达比较奇怪,例如判断 target 是否为null,如果不为 nll 则做xxx动作

    <#if target??>
        xxxx
    </#if>

    2. 字符串或数字比较

    java里标准字符串比较需要 .equals() 方法,在freemarkder中进行了简化,字符串的比较方法和数字做到完全一样

    <#if str == "success">
        xxx
    </#if>
    
    <#if str !== "error">
        xxx
    </#if>

    3.判断设置默认值

    <#if (target)!"defalutValue">
        xxxx
    </#if>

    if else elseif

    <#if att.user.name==invest.user.name&invest.state==0>
    ...
    <#elseif att.user.name==invest.user.name&invest.state==3>
    ...
    <#elseif att.user.name==invest.user.name&(invest.state1=3&invest.state!=0)>
    ...
    <elseif  att.user.name!=invest.user.name>

     switch、case、default、break指令

     虽然FreeMarker提供了switch指令,但它并不推荐使用switch指令来控制也输出,而是推荐使用FreeMarker的if..elseif..else 指令来替代它。

    <#switch value>
               <#case refValue>
                  ...
                  <#bread>
               <#case refValue>
                  ...
                  <#bread>
               <#default>
                  ...
            </#switch>

     list、break指令

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

    <#list sequence as item>
           ...
         </#list>

     除此之外,迭代集合对象时,还包括两个特殊的循环变量:

    a、item_index:当前变量的索引值。
    b、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]
              在上面的语法格式中,两个参数的解释如下
              a、filename:该参数指定被包含的模板文件
              b、options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,encoding指定包含页面时所使用的解码集,而parse指定被
                 包含是否作为FTL文件来解析。如果省略了parse选项值,则该选项值默认是true

         import指令
            该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import 指令的语法格式如下

      <#import path as mapObject>
            在上面的语法格式中,path指定要被导入的模板文件,而mapObject是一个Map对象名,通过这行代码,将导致path模板中的所有变量都被放置
            在mapObject中
            <#import "/lib/common.ftl" as com>

      noparse指令

     noparse指令指定FreeMarker不处理该指令里包含的内容,该指令的语法格式如下:
             <#noparse>
                ...
             </#noparse>

    escape、noescape指令
           
           
        assign指令
            它用于为该模板页面创建或替换一个顶层变量
            
         setting指令
            该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:

    <#setting name = value>
            name 的取值范围包括如下几个
             locale :该选项指定该模板所用的国家/语言选项
             number_format:该选项指定格式化输出数字的格式
             boolean_format:该选项指定两个布尔值的语法格式,默认值是"true、false"
             date_format,time_format,datetime_format:该选项指定格式化输出日期的格式
             time_zone:  设置格式化输出日期时所使用的时区

    acro、nested、return指令

    知识只有共享才能传播,才能推崇出新的知识,才能学到更多。
  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/wqsbk/p/7843800.html
Copyright © 2011-2022 走看看