freemarker(一)

作者: 搁浅的双鱼 | 来源:发表于2016-06-20 10:13 被阅读595次

    what

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具

    why

    选择freemarker的原因:
    • 1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
    • 2、宏定义比jsp tag方便
    • 3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
    • 4、支持jsp标签
    • 5、可以实现严格的mvc分离

    how

    请接下来往下面看

    FreeMarker模板文件主要由如下4个部分组成:
    • 1,文本:直接输出的部分
    • 2,注释:<#-- ... -->格式部分,不会输出
    • 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出
    • 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
    例子
    <html><br>
    <head><br>
    <title>Welcome!</title><br>
    </head><br>
    <body><br>
    <#-- 注释部分 --><br>
    <#-- 下面使用插值 -->
    <h1>Welcome ${user} !</h1><br>
    <p>We have these animals:<br>
    <u1><br>
    <#-- 使用FTL指令 -->
    <#list animals as being><br>
       <li>${being.name} for ${being.price} Euros<br>
    <#list><br>
    <u1><br>
    </body><br>
    </html>
    

    1.插值规则

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

    1.1基本输出

    • 输出 ${book.name}
    • 空值判断:${book.name?if_exists },
      ${book.name?default(‘xxx’)} //默认值xxx
      ${ book.name!"xxx"}//默认值xxx
    • 日期格式:${book.date?string('yyyy-MM-dd')}
    • 数字格式:${book?string.number} //20
      ${book?string.currency} //$20.00
      ${book?string.percent} //20%

    2.FTL指令规则

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

    • 1,开始标签:<#directivename parameter>
    • 2,结束标签:</#directivename>
    • 3,空标签:<#directivename parameter/>

    2.1遍历List集合

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

    这里会逐个输出星期几

    此外,迭代集合对象时,还包含两个特殊的循环变量:
    item_index:当前变量的索引值
    item_has_next:是否存在下一个对象
    也可以使用<#break>指令跳出迭代

    2.2遍历map集合

    {"语文":78, "数学":80}
    Map对象的key和value都是表达式,但是key必须是字符串

    <#list map?keys as key>  
          ${key}=${map[key]}<br />  
    </#list>  
    

    2.3逻辑判断

    if判断
    <#if condition>    ...
    <#elseif condition2>    ...
    <#elseif condition3>    ......
    <#else>    ...    
    </#if>
    

    ==其中空值判断可以写成==<#if book.name?? >

    switch判断
    <#switch value>
        <#case refValue1> ...
            <#break>
        <#case refValue2> ...
            <#break>
        <#case refValueN>...
            <#break>
        <#default>        
    </#switch>
    

    3.内置函数

    常用的内置的字符串函数:

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

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

    • size:获取序列中元素的个数
    • chunk:分成几个一组
    • xxx_index :计数器

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

    • int:取得数字的整数部分,结果带符号

    4.空值处理

    FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变量完全相同.

    为了处理缺失变量,FreeMarker提供了两个运算符:

    • !:指定缺失变量的默认值
    • ??:判断某个变量是否存在

    其中,!运算符的用法有如下两种:
    variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象.

    使用!指定默认值时,并不要求默认值的类型和变量类型相同.使用??运算符非常简单,它总是返回一个布尔值,用法为:variable??,如果该变量存在,返回true,否则返回false

    相关文章

      网友评论

        本文标题:freemarker(一)

        本文链接:https://www.haomeiwen.com/subject/tvjwdttx.html