您的位置:首页 > 其它

FreeMarker学习笔记

2016-10-05 01:54 141 查看

语言概述

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。

FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件。

FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境。

为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员

数据类型

一、 直接指定值

1. 字符串

单引号或者双引号限定

2. 数值

数值可以直接输入,不需要引号

3.布尔值

直接使用true或false

4.集合

中括号[]包括,集合元素之间用逗号分隔

5.Map对象

用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔

6.时间对象

root.put("date1", new Date());
${date1?string("yyyy-MM-dd HH:mm:ss")}


7.JavaBean的处理

freemarker处理javabean可以将类型自动转化

二、 输出变量值

1.顶层变量

最最最普通的变量

2.输出集合元素

可以根据集合元素的索引来输出集合元素,索引用中括号包括。如: 输出[“1”,“2”,“3”]这个名为number的集合,可以用${number[0]}来输出第一个数字。FreeMarker还支持用number[1..2]来表示原 集合的子集合[“2”,“3”]。

3.输出Map元素

对于JavaBean实例,FreeMarker一样把它看作属性为key,属性值为value的Map对象。

输出Map对象时,可以使用点语法或中括号语法

book.author.name
book.author["name"]
book["author"].name
book["author"]["name"]


三、字符串操作

1.字符串连接

方法一:${"Hello, ${user}"}
方法二:${"Hello, " + user + "!"}


2.截取字串

截取子串可以根据字符串的索引来进行

<#assign number="01234">
${number[0]} <#-- 输出字符0 -->
${number[0..3]} <#-- 输出子串“0123” -->


四、集合连接操作

连接集合的运算符为“+”

五、Map连接操作

Map连接操作的运算符为“+”

六、算术运算符

FreeMarker表达式中支持“+”、“-”、“*”、“/”、“%”运算符。

七、比较运算符

主要记住几个:

大于:gt

大于等于:gte

小于:lt

小于等于:lte

八、逻辑运算符

1. &&: 逻辑与;

2. ||: 逻辑或;

3. !: 逻辑非

九、内建函数

十、空值处理运算符

测试空值处理:
<#-- ${sss} 没有定义这个变量,会报异常! -->
${sss!} <#--没有定义这个变量,默认值是空字符串! -->
${sss!"abc"} <#--没有定义这个变量,默认值是字符串abc! -->


所以一般在开发中最常用第二种方法

数据类型常见示例

直接指定值

字符串 : “Foo”或 者’Foo’或”It’s \”quoted\”“或r”C:\raw\string”

数字:123.45

布尔值:true, false

序列:[“foo”, “bar”, 123.45], 1..100

哈希表:{“name”:”green mouse”, “price”:150}

检索变量  顶层变量:user

从哈希表中检索数据:user.name, user[“name”]

从序列中检索:products[5]

特殊变量:.main

字符串操作

插值(或连接):”Hello ${user}!”(或”Free” + “Marker”)

获取一个字符:name[0]

序列操作

连接:users + [“guest”]

序列切分:products[10..19] 或 products[5..]

哈希表操作

连接:passwords + {“joe”:”secret42”}

算数运算: (x * 1.5 + 10) / 2 - y % 100

比 较 运 算 : x == y, x != y, x < y, x > y, x >= y, x <= y,

x < y, 等等

逻辑操作:!registered && (firstVisit || fromEurope)

内建函数:name?upper_case

方法调用:repeat(“What”, 3)

处理不存在的值

默认值:name!”unknown” 或者(user.name)!”unknown” 或者name! 或者 (user.name)!

检测不存在的值:name?? 或者(user.name)??

参考:运算符的优先级

模板开发语句

if指令

if语句测试:
${user}是<#if user=="老高">我们的老师</#if>
------------------------------------------------
if else 语句测试:
<#if num0 gt 18>  <#--不是使用>,大部分时候,freemarker会把>解释成标签结束! -->
及格!
<#else>
不及格!
</#if>
---------------------------------------------------
if else if else语句测试:
<#if random gte 90>
优秀!
<#elseif random gte 80>
良好!
<#else>
一般!
</#if>


list指令

List list = new ArrayList();
list.add(new Address("中国","北京"));
list.add(new Address("中国","上海"));
list.add(new Address("美国","纽约"));
root.put("lst", list);
--------------------------------------------
测试list指令:
<#list lst as dizhi >
<b>${dizhi.country}</b> <br/>
</#list>


include指令

测试include指令:
<#include "included.txt" />


自定义指令(macro指令)

<#macro m1>   <#--定义指令m1 -->
<b>aaabbbccc</b>
<b>dddeeefff</b>
</#macro>
-----------------------
<@m1 /><@m1 />  <#--调用上面的宏指令 -->


带参数的宏指令

<#macro m2 a b c >
${a}--${b}--${c}
</#macro>
-------------------------
<@m2 a="老高" b="老张" c="老马" />


nested指令:

<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</td></tr></table>
</#macro>
------------------------
<@border >表格中的内容!</@border>


命名空间

命名空间命名规则

一个重要的规则就是路径不应该包含大写字母,为了分隔词语,使用下划线_,就像

wml_form(而不是wmlForm)。

在Servlet中使用Freemarker

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: