一、什么是FreeMarker?

FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念
 他们是分工劳动的:设计者专注于表示——创建HTML文件、图片、Web页面的其它可
视化方面;程序员创建系统,生成设计页面要显示的数据
 经常会遇到的问题是:在Web页面(或其它类型的文档)中显示的信息在设计页面时
是无效的,是基于动态数据的
 在这里,你可以在HTML(或其它要输出的文本)中加入一些特定指令,FreeMarker会
在输出页面给最终用户时,用适当的数据替代这些代码

 <html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>

这个例子是在简单的HTML中加入了一些由${…}包围的特定代码,这些特定代码是
FreeMarker的指令,而包含FreeMarker的指令的文件就称为模板(Template)
 至于user、latestProduct.url和latestProduct.name来自于数据模型(data model)
 数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,
甚至于在程序中直接生成
 模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型

所以 模版+数据模型=输出

当FreeMarker将上面的数据模型合并到模板中,就创建了下面的输出

 <html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome Big Joe!</h1>
<p>Our latest product:
<a href="products/greenmouse.html">green mouse</a>!
</body>
</html>

二、什么是数据模型?

典型的数据模型是树型结构,可以任意复杂和深层次,如下面的例子:
(root)
|
+- animals
| |
| +- mouse
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- elephant
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- python
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- test = "It is a test"
|
+- whatnot
|
+- because = "don't know"
 类似于目录的变量称为hashes,包含保存下级变量的唯一的查询名字
 类似于文件的变量称为scalars,保存单值
 scalars保存的值有两种类型:字符串(用引号括起,可以是单引号或双引号)和数字
(不要用引号将数字括起,这会作为字符串处理)
 对scalars的访问从root开始,各部分用“.”分隔,如animals.mouse.price
 另外一种变量是sequences,和hashes类似,只是不使用变量名字,而使用数字索引,
如下面的例子:

(root)
|
+- animals
| |
| +- (1st)
| | |
| | +- name = "mouse"
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- (2nd)
| | |
| | +- name = "elephant"
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- (3rd)
| |
| +- name = "python"
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- whatnot
|
+- fruits
|
+- (1st) = "orange"
|
+- (2nd) = "banana"
 这种对scalars的访问使用索引,如animals[0].name

三、什么是模版?

 在FreeMarker模板中可以包括下面三种特定部分:
 ${…}或#{...}:称为interpolations(插值),FreeMarker会在输出时用实际值进行替代
 FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记
区分,用#开始(有些以@开始,在后面叙述)
 注释:包含在<#--和-->(而不是<!--和-->)之间
 下面是一些使用指令的例子:

下面是一些使用指令的例子:

 if指令
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#else>
Pythons are not cheaper than elephants today.
</#if>
 list指令
<p>We have these animals:
<table border=1>
<tr><th>Name<th>Price
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
</table>

 include指令

 <html>
<head>
<title>Test page</title>
</head>
<body>
<h1>Test page</h1>
<p>Blah blah...
<#include "/copyright_footer.html">
</body>
</html>

注意事项:
 FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和$
{NAME}是不同的
 Interpolation只能在文本中使用
 FTL标记不能位于另一个FTL标记内部

 注释可以位于FTL标记和Interpolation内部

四、FreeMarker指令

 在FreeMarker中,使用FTL标记引用指令
 有三种FTL标记,这和HTML标记是类似的:
 开始标记:<#directivename parameters>
 结束标记:</#directivename>
 空内容指令标记:<#directivename parameters/>
 有两种类型的指令:预定义指令和用户定义指令
 用户定义指令要使用@替换#,如<@mydirective>...</@mydirective>

有一类特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不
具有特殊含义,该类字符串在引号前面加r,下面是一个例子:
${r"${foo}"}
${r"C:\foo\bar"}
输出的结果是:
${foo}
C:\foo\bar

字符串的操作

${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>

内建函数
 内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出常用的
一些函数
 字符串使用的:
 html:对字符串进行HTML编码
 cap_first:使字符串第一个字母大写
 lower_case:将字符串转换成小写
 upper_case:将字符串转换成大写
 trim:去掉字符串前后的空白字符
 序列使用的:
 size:获得序列中元素的数目
 数字使用的:
 int:取得数字的整数部分(如-1.9?int的结果是-1)
 例子(假设test保存字符串"Tom & Jerry"):
${test?html}
${test?upper_case?html}
输出结果是:
Tom &amp; Jerry
TOM &amp; JERRY

Interpolation(插值)
 Interpolation有两种类型:
 通用Interpolation:${expr}
 数字Interpolation:#{expr}或#{expr; format}
 注意:Interpolation只能用于文本部分
 通用Interpolation
 插入字符串值:直接输出表达式结果
 插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本
输出;可以使用内建函数string格式化单个Interpolation

五、在模板中定义变量

在模板中定义的变量有三种类型:
 plain变量:可以在模板的任何地方访问,包括使用include指令插入
的模板,使用assign指令创建和替换
 局部变量:在宏定义体中有效,使用local指令创建和替换
 循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;
宏的参数是局部变量,而不是循环变量
局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部
变量和plain变量

未完待续。。。

初识FreeMarker的更多相关文章

  1. 【学习笔记】初识FreeMarker简单使用

    楔子: 之前在和同事讨论,同事说“jsp技术太古老了,有几种页面技术代替,比如FreeMarker.Velocity.thymeleaf,jsp快废弃了……”云云.我这一听有点心虚……我在后端部分越刨 ...

  2. Maven的下载,安装,配置,测试,初识以及Maven私服

    :Maven目录分析 bin:含有mvn运行的脚本 boot:含有plexus-classworlds类加载器框架 conf:含有settings.xml配置文件 lib:含有Maven运行时所需要的 ...

  3. ? 初识Webx 3

    初识webx 2: http://www.cnblogs.com/lddbupt/p/5552351.html Webx Turbine建立在Webx Framework的基础上,实现了页面渲染.布局 ...

  4. spring源码分析之freemarker整合

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...

  5. Maven 整合FreeMarker使用

    pom.xml <!-- freemarker jar --> <dependency> <groupId>org.freemarker</groupId&g ...

  6. JAVA FreeMarker工具类

    FreeMarkerUtil.java package pers.kangxu.datautils.utils; import java.io.File; import java.io.StringW ...

  7. FreeMarker:怎么使用

    第一个FreeMarker程序 1. 建立一个普通的java项目:testFreeMarker 2. 引入freemarker.jar包 3. 在项目目录下建立模板目录:templates 4. 在t ...

  8. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  9. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

随机推荐

  1. UVA 408 Uniform Generator 伪随机数(水)

    题意:根据这个式子来递推求得每个随机数x,step和mod给定,seed(0)=0.如果推出来的序列是mod个不重复的数字(0~mod-1)则打印good,否则bad(因为不能产生所有的数). 思路: ...

  2. Java [Leetcode 137]Single Number II

    题目描述: Given an array of integers, every element appears three times except for one. Find that single ...

  3. Oracle权限一览表

    权限 所能实现的操作 分析 ANALYZE ANY  分析数据库中的任何表.簇或索引 审计 AUDIT ANY  审计数据库中的任何模式对象 AUDIT SYSTEM  启用与停用语句和特权的审计选项 ...

  4. HDU 5744 Keep On Movin

    Keep On Movin Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  5. Android 中屏幕点击事件的实现

    在Android中如何用代码触发按钮点击事件?我想要触发代码执行按钮点击.实现对于单击按钮事件的模拟,触发单击按钮进入另一个界面. 就是声明一下什么moonlightcheese被声明了:在andro ...

  6. User Agent

    Android: Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; MI-ONE Plus Build/GINGERBREAD) AppleWebKit/533 ...

  7. Color Length

    题意: 给出两个字符串,求把两字符串组成一个字符串使的字符串中的相同字母的最远距离的和最小. 分析: 本题关键在于怎么计算距离和的方法上.dp[i][j]表示处理到长度i的a串,长度j的b串还需要的计 ...

  8. XTUOJ 1246 Heartstone 贪心

    题意:挺好懂得 分析:先计算出如果不能用(减2)操作,至少需要多少个(减3)操作,这个很好计算 然后就是尽量多的去减少(减3)操作,肯定先抹平 余2 和 余1 的,然后就可以了 #include &l ...

  9. <转>python version 2.7 required,which was not found in the registry

    安装PIL-1.1.7.win32-py2.7的时候,不能再注册表中识别出来python2.7 方法:新建一个register.py 文件,把一下代码贴进去,保存 # # script to regi ...

  10. hadoop1.2.1三种模式配置

    1.本地模式 本地模式的安装 将hadoop 安装包解压后不用任何配置就是默认的本地模式 此时 core-site.xml ,hdfs-site.xml , marped.site.xml 三个配置文 ...