手记

模板引擎之------freemarker

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。
Freemarker是一个基于Java语言的模板引擎,不是web框架,是一个试图层的组件,主要用于解析服务器端的数据,并展示到视图层。
语法:
JAVA中常用的数据模型 :
基本类型数据(比如Integer)
封装的对象类型(比如User对象)
集合类型(List Map)

取值指令 :
常用${var}语法进行取值
对null、不存在对象取值${var!}
取包装对象的值,通过“点”语法:${User.name}
取值的时候进行计算,赋值
Date类型格式${data?String('yyyy-MM-dd')}
如何转义HTML内容:${var?html}
函数:
(一)处理字符串内建函数:
substring 字符串的截取
cap_first 首字母变大写
ends_with 以...结尾的函数
contains 字符串是否包含目标字符串的函数
如何把一个字符串转化为date 、datetime 、time类型的函数 date datetime time;
starts_with 字符串以...开始
index_of 字符串所在的位置
last_index_of 字符串最后所在的位置
split 分割字符串
trim 去掉字符串两头的空格
等函数
(二)处理数字的内建函数
string x?string("0.##") 对数字进行格式化
round 四舍五入
floor 把小数点去掉
ceiling 数字进1,变成整数
(三)处理list内建函数:
first 取list第一个值
last 取list最后一个值
seq_contains 这个序列是否包含
seq_index_of 这个序列所在的位置
size list长度
reverse 倒序
sort 升序排序
sort_by 根据属性排序
trunk 把字符串分块处理
(四)其他内建函数
is函数:判断变量的类型
is_string 字符串
is_number 整数
is_method 方法
() 对变量进行判断
hs_content 判断对象是否是空值,是不是有内容
eval 求值函数

更多语法,在这里不再列举
实例代码:
(一)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>freemarker</title>
</head>
<body>
    <h1>取值:</h1>
    <ul>
        <li>整数:<font size="20px" color="red">${intVar}</font></li>
        <li>长整数:<font size="20px" color="blue">${LongVar}</font></li>
        <li>双精度:<font size="20px" color="pink">${doubleVar}</font></li>
        <li>字符串:<font size="20px" color="yellow">${StringVar}</font></li>
        <li>布尔值: <font size="20px" color="green">${booleanVar?string('yes','no')}</font></li>
        <li>日期类型Java.Util.Date:<font size="20px" color="red">${dateVar1?string('yyyy-MM-dd
                HH:mm:ss')}</font></li>
        <li>空值:<font size="20px" color="pink">${nullVar1!}</font></li>
        <li>空值:<font size="20px" color="green">${nullVar!'我是默认值'}</font></li>
        <li>不存在的变量:<font size="20px" color="blue">${变量!'我是默认变量'}</font></li>
        <li>不存在的变量1:<font size="20px" color="red">${free!'我是默认变量'}</font></li>
    </ul>
    <hr size="10" color="blue">
    <ul>
        <li>赋值&运算</li>
        <#assign a=100 />
        a =
        <font color="red">${a}</font>
        <br /> a+100=
        <font coloe="blue">${a+100}</font>
        <br />
    </ul>
</body>
</html>

(二)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>freemarker</title>
<style type="text/css">
body {
    font-weight: bold;
}
</style>
</head>
<body>
    <h1>freemarker实现遍历list集合</h1>
    <ul>
        <li>集合list</li>
        <#list myList as item> <font color="blue" size="20px">${item}</font>
        <br />
        </#list>
    </ul>

    <hr size="10" color="blue">
    <h1>if表达式</h1>
    <ul>
        <li>if</li>
        <#assign var=99 />
        <#if var==99> <font color="red">var=99</font> </#if>
        <br />

        <#if var==99> <font color="red">var=99</font> <#else> <font
            coloe="green">var!=99</font></#if>
        <br />

        <#ifvar> 99> <!-- >  大于 --> <font color="red">var大于99</font>
        <#elseif var==99> <font coloe="green">var=99</font> <#else>
        <font coloe="blue">var小于99</font> </#if> <br />

        <li>if多条件 ||,&&,!</li>
        <#assign var='python'> <#if var== 'python' || var=='Java'>
        <font color="red">python or java</font>
        <br />
        </#if> <#if var== 'python' && var?length==6>
  <font color="yellow">python length 6</font><br/>
  </#if> <#if (var==
            'python' && var?length== 6) || (var== 'java')> <font
            color="black">python length 6或者Java</font>
        <br />
        <br />
        </#if> <#if !((var== 'python' && var?length== 6) || (var== 'java'))> <font
            color="black">python length 6或者Java</font>
        <br />
        <br />
        </#if>
    </ul>
</body>
</html>

(三)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>freemarker</title>
<style type="text/css">
  body{
    font-weight:bold;
  }
</style>
</head>
<body>
<h1>freemarker遍历map集合</h1>
<ul>
<li>集合map</li>
<#list map?keys as key>
  <font color="green" size="20px">${key}:${map[key]}</font><br/>
</#list>
</ul>
<hr size="10" color="red">
<h3>switch语句</h3>
<ul>
  <li>switch,case,break,default</li>
  <#assign var = 8/>
  <#switch var>
     <#case 1>星期一 <#break>
     <#case 2>星期二 <#break>
     <#case 3>星期三 <#break>
     <#case 4>星期四 <#break>
     <#case 5>星期五 <#break>
     <#case 6>星期六 <#break>
     <#case 7>星期日 <#break>
     <#default>无效的星期
  </#switch>
</ul>
<hr size="10" color="blue">
<ul>
  <li>switch,case,break,default</li>
  <#assign var = 'java'/>
  <#switch var>
     <#case 'java'>我是java <#break>
     <#case 'python'>我是python <#break>
     <#case 'C'>我是C语言 <#break>
     <#default>我是谁?谁是我?
  </#switch>
</ul>
</body>
</html>

(四)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>freemarker内建函数</title>
</head>
<body>
    <h1>内建函数</h1>
    <ul>
        <h2>1,字符串内建函数</h2>
        <#list "a|b|c|d"?split("|") as item>
        <li>${item}</li>
        </#list>
    </ul>
    <hr size="10" color="red">

    <h1>字符串转日期</h1>
    <ul>
        <#assign var1="23/02/2017" ?date("MM/dd/yyyy")/> 
        <#assign var2="11:34:33" ?time("HH:mm:ss")/> 
        <#assign var3="2017-02-23 11:35 PM" ?datetime("yyyy-MM-dd hh:mm")/>
        <li>${var1}</li>
        <li>${var2}</li>
        <li>${var3}</li>
    </ul>
    <hr size="10" color="blue">

    <h1>数字类型的内建函数</h1>
    <ul>
        <#assign numVar1=314.5662789 />
        <li>格式化:${numVar1?string("0.##")}</li> 
        <li>四舍五入:${numVar1?round}</li> 
        <li>去掉小数点:${numVar1?floor}</li> 
        <li>进1:${numVar1?ceiling}</li>
    </ul>
    <hr size="10" color="black">

    <h1>list内建函数</h1>
    <ul>
        <#assign listVar1=[1,2,3,4,11,12,13,14,21,22,23,24] />

        <li>分块处理取长度:${listVar1?chunk(4)?size}</li>
        <li>长度:${listVar1?size}</li>
        <#list listVar1?chunk(4)?last as item>
          <li>${item}</li>
        </#list>
        <li>取list第一个值:${listVar1?first}</li>
        <li>取list最后一个值:${listVar1?last}</li>
    </ul>
    <hr size="10" color="green">

    <h1>其他内建函数</h1>
    <ul>
        <#assign sVar = 'helloworld'/>
        <li>${sVar?is_number?string('yes','no')}</li>
        <li>${sVar?has_content?string('yes','no')}</li>
        <li>${"1"+"2"?eval}</li>
        <li>${(1+2)?eval}</li>
        <li>${"1"+"2"?is_string?string('yes','no')}</li>
        <li>${("1"+"2")?is_string?string('yes','no')}</li>
    </ul>
</body>
</html>

(五)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>macro,nested,return:实战demo</h1>
<h2>1.macro:宏指令</h2>
<ul>
  <li>FreeMarker:无参数的macro</li>
  <div>
    <#macro test>
      <font color="red" size="18px">我是无参数的macro</font>
    </#macro>
    <@test/>
  </div>
  <li>Freemarker2:有参数的macro</li>
  <div>
    <#macro test param1 param2>
      <font color="blue" size="18px">我是有参数的macro,paeam1=${param1},param2=${param2}</font>
      <br/>
    </#macro>
    <@test param1="java" param2="python"/>
  </div>
  <li>Freemarker3:有参数的macro</li>
  <div>
    <#macro test param1 param2="JavaScript">
      <font color="blue" size="18px">我是有参数的macro,paeam1=${param1},param2=${param2}</font>
      <br/>
    </#macro>
    <@test param1="java" param2="hello python"/>
  </div>
  <li>Freemarker4:有多个参数的macro</li>
  <div>
    <#macro test param1 param2="python" paramExt...>
      <font color="green" size="18px">我是有参数的macro,paeam1=${param1},param2=${param2}</font>
      <br/>
      <font color="blue" size="18px">${paramExt['param3']}</font>
      <font color="blue" size="18px">${paramExt['param4']}</font>
    </#macro>
    <@test param1="java" param2="python" param3="nodejs" param4="html"/>
  </div>
</ul>
<hr size="10" color="red">
<h2>2,nested</h2>
<div>
  <ul>
    <#macro test param1="java">
      ${param1}<br/>
      <#nested param1,"我的nested参数"><br/>
    </#macro>

    <li>调用</li>
    <div>
      <@test param1="java";loopVar1,loopVar2>
        <font color="green" size="18px">hello ${loopVar1},${loopVar2}</font><br/>
      </@test>

      <@test param1="python"; loopVar1>
        hello ${loopVar1}<br/>
      </@test>
    </div>
  </ul>
  <hr size="10" color="pink">
  <div>
    <h2>3,函数</h2>
    <ul>
      <#function doAdd param1 param2>
        <#return param1+param2>
      </#function>
      <li>调用</li>
      <div>你好,我是调用${doAdd(100,100)}</div>
    </ul>
  </div>
</div>
</body>
</html>

更多代码在这里不再一一列举,感兴趣的朋友可以到我的github上下载源码。此代码基于SpringBoot实现,后台还有众多Java代码。感谢各位的支持!
源代码地址:
https://github.com/JavaCodeMood/freemarker

20人推荐
随时随地看视频
慕课网APP

热门评论

3Q

支持下碉堡了!!!!!

不知道说什么 厉害了

查看全部评论