zoukankan      html  css  js  c++  java
  • Freemarker 语法详解

    Freemarker 在线中文官方参考手册

    Freemarker是一款模板引擎,是一种基于模版生成静态文件的通用工具,它是使用纯java编写的,一般用来生成HTML页面。

    Freemarker 生成静态页面,首先需要使用自己定义的模板页面,这个模板页面可以是最最普通的html,也可以是嵌套freemarker中的 取值表达式, 标签或者自定义标签等等,然后后台读取这个模板页面,解析其中的标签完成相对应的操作, 然后采用键值对的方式传递参数替换模板中的的取值表达式,做完之后 根据配置的路径生成一个新的html页面, 以达到静态化访问的目的。

    一、FreeMarker模板文件

    主要有4个部分组成:

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

    <html> 
    <body>  
    <#-- 注释部分 -->
    <br>  
    <#-- 下面使用插值 -->  
    <h1>Welcome ${user} !</h1>
    <p>We have these animals:
    <u1>
    <#-- 使用FTL指令 -->  
    <#list animals as being>
      <li>${being.name} </li>
    <#list>
    <u1>
    </body>
    </html>

    1. 指令

    (1)list 指令

    <#list nameList as names>    
      ${names}   
    </#list>

    主要是进行迭代服务器端传递过来的List集合,name 是 list 循环的时候取的一个循环变量。相关指令:

    item_index:当前变量的索引值 
    item_has_next:是否存在下一个对象
    break:跳出迭代

    (2)if 指令

    <#if name == "freemarker">
      freemarker 模板引擎
    </#if>
    <#assign number1 = 8>
    <#assign number2 = 5>
    <#if (number1 + number2 > 12 || number1 - number2 > 6)>
        "*" : ${number1 * number2}
    <#else>
        "/" : ${number1 / number2}
    </#if>
    <#if users??>  <#--空判断-->
        <#list users as user >
            ${user.id} - ${user.name}
        </#list>
    <#else>
        ${user!"变量为空则给一个默认值"}
    </#if>

    (3)include 指令

    <#include filename>
    <#include filename options>

    该标签用于导入文件。option包含下面2种属性:

    encoding="GBK" 编码格式 
    parse=true 是否作为ftl语法解析,默认是 true,false 就是以文本方式引入。注意在ftl文件里布尔值都是直接赋值的如 parse=true,而不是 parse="true"

    <#include "include.html"/>  
    <#include "include.ftl" encoding="GBK"/>
    <#include "/common/copyright.ftl" encoding="GBK" parse=false/>

    (4)switch , case , default , break 指令

    语法:

    <#switch value>
        <#case refValue>语句1<#break>
        <#case refValue>语句2<#break>
        <#default>语句3
    </#switch>

    示例:

    <#switch name>
        <#case "freemarker">This is a freemarker's template.<#break>
        <#case "velocity">This is a velocity's template.<#break>
        <#default>This is a jsp's template.
    </#switch>

    (5)macro 宏指令

    定义宏:

    <#macro mo>
        定义无参数的宏macro--${name}
    </#macro>
    <#macro moArgs a b c>
        定义带参数的宏macro--${a+b+c}
    </#macro>

    调用宏:

    <@mo />
    <@moArgs a=1 b=2 c=3 />

    (6)import 指令

    类似于java里的 import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件。

    <#import path as hash>

    path:文件路径

    hash:为导入的文件定义命名空间

    (7)assign 指令

    assign指令用于为该模板页面创建或替换一个顶层变量。

    <#assign a=1>
    <#assign x=1 y=2>
    <#assign arg1>
        hello freemarker
    </#assign>
    
    <#assign arg2>
        ${arg1} world
    </#assign>
    
    <#assign arg3="${arg1} world">

    (8)noparse 指令

    noparse指令指定FreeMarker不处理该指定里包含的内容。

    <#assign a=1>
    <#noparse>
        ${a}
    </#noparse>
    
    输出结果:
    ${a}

    (9)setting 指令

    <#setting name=value>

    该指令用于设置FreeMarker的运行环境,name的取值范围包含如下几个:

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

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

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

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

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

    二、示例

    字符串输出:
    ${"Hello ${name} !"} / ${"Hello " + name + " !"}
    <#assign cname=r"特殊字符完成输出(http:www.baidu.com)">
    ${cname}
    
    字符串截取 : 
    通过下标直接获取下标对应的字母: ${name[2]}
    起点下标..结尾下标截取字符串:${name[0..5]}
    
    算数运算:
    <#-- 支持"+"、"-"、"*"、"/"、"%"运算符 -->
    <#assign number1 = 10>
    <#assign number2 = 5>
    "+" : ${number1 + number2}
    "-" : ${number1 - number2}
    "*" : ${number1 * number2}
    "/" : ${number1 / number2}
    "%" : ${number1 % number2}
    
    比较运算符:
    <#if number1 + number2 gte 12 || number1 - number2 lt 6>
    "*" : ${number1 * number2}
    <#else>
    "/" : ${number1 / number2}
    </#if>
    
    内建函数:
    <#assign data = "abcd1234">
    第一个字母大写:${data?cap_first}
    所有字母小写:${data?lower_case}
    所有字母大写:${data?upper_case}
    <#assign floatData = 12.34>
    数值取整数:${floatData?int}
    获取集合的长度:${users?size}
    时间格式化:${dateTime?string("yyyy-MM-dd")}
    
    空判断和对象集合:
    <#if users??>
    <#list users as user >
    ${user.id} - ${user.name}
    </#list>
    <#else>
    ${user!"变量为空则给一个默认值"}
    </#if>
    
    Map集合:
    <#assign mapData={"name":"程序员", "salary":15000}>
    直接通过Key获取 Value值:${mapData["name"]}
    通过Key遍历Map:
    <#list mapData?keys as key>
    Key: ${key} - Value: ${mapData[key]}
    </#list>
    通过Value遍历Map:
    <#list mapData?values as value>
    Value: ${value}
    </#list>
    
    List集合:
    <#assign listData=["ITDragon", "blog", "is", "cool"]>
    <#list listData as value>${value} </#list>
    
    include指令:
    引入其他文件:<#include "otherFreeMarker.ftl" />
    
    macro宏指令:
    <#macro mo>
    定义无参数的宏macro--${name}
    </#macro>
    使用宏macro: <@mo />
    <#macro moArgs a b c>
    定义带参数的宏macro-- ${a+b+c}
    </#macro>
    使用带参数的宏macro: <@moArgs a=1 b=2 c=3 />
    
    命名空间:
    <#import "otherFreeMarker.ftl" as otherFtl>
    ${otherFtl.otherName}
    <@otherFtl.addMethod a=10 b=20 />
    <#assign otherName="修改otherFreeMarker.ftl中的otherName变量值"/>
    ${otherFtl.otherName}
    <#assign otherName="修改otherFreeMarker.ftl中的otherName变量值" in otherFtl />
    ${otherFtl.otherName}
  • 相关阅读:
    mysql--笔记1
    html-day04
    转换流 Properties集合 序列化 工具
    html--笔记day03
    map集合的应用
    关于IO流---笔记1
    关于什么是编码表的说明
    实现斗地主纸牌游戏---洗牌 发牌 看底牌的具体功能------Map集合存储方法 遍历的应用
    计算属性
    组件-配置组价
  • 原文地址:https://www.cnblogs.com/Jimc/p/9791507.html
Copyright © 2011-2022 走看看