FreeMarker笔记
来源:互联网 发布:mac u盘装win7 提示 编辑:程序博客网 时间:2024/06/08 07:01
http://freemarker.org/docs/dgui_quickstart.html
data-model
1、data-model可以被看做是树形结构
2、scalars存储一个特定的值。这个值可以是string、number、date-time/date/time、boolean.
3、hashes是一个容器,存储其他变量并且关联一个唯一的索引名。
4、sequences是一个容器,存储其他变量在一个有序序列中。存储的变量可以通过数字化索引值获取到,索引从0开始。
(root) | +- animals | | | +- mouse | | | | | +- size = "small" | | | | | +- price = 50 | | | +- elephant | | | | | +- size = "large" | | | | | +- price = 5000 | | | +- python | | | +- size = "medium" | | | +- price = 4999 | +- message = "It is a test" | +- misc | +- foo = "Something"
hashes :看起来像目录的variable(如root、animals、mouse、elephant、Python、misc)叫做hashes.
sub-variables :hashes存储的其他variable,叫做subvariable
lookup-name :hashes通过一个lookup name存储sub variables。如animals、mouse、elephant、Python。
虽然lookup-name就是hashes,但有种情况是没有lookup-name的variable——sequences
sequences :相对于hashes,是另一种重要的variables。他们存储subvariables跟hashes一样,但是这里的subvariables没有名字(lookup-name),他们只是list中的items,例如下面的animals和misc.fruits就是sequences。
(root) | +- animals | | | +- (1st) | | | | | +- name = "mouse" | | | | | +- size = "small" | | | | | +- price = 50 | | | +- (2nd) | | | | | +- name = "elephant" | | | | | +- size = "large" | | | | | +- price = 5000 | | | +- (3rd) | | | +- name = "python" | | | +- size = "medium" | | | +- price = 4999 | +- misc | +- fruits | +- (1st) = "orange" | +- (2nd) = "banana"
template
最简单的template是一个单纯的html文件(诸如此类的text文件,freemarker并不不局限于html),当客户端访问页面时,freemarker会将该html发送到客户端。
但是,如果我们希望该页面更动态化,那么我们开始放一些freemarker能读懂的特殊的部分在html中:
1、${...} :freemarker将替换花括号内的计算结果的结果输出。叫做interpolations
2、FTL tags(FreeMarker Template Language tags) :FTL标签有点类似HTML标签,是一些freemarker的指令,并且不会被输出。这些标签是以#开头,如果是自定义标签则是以@开头。
3、Comments :freemarker的注解类似于HTML的注解,不过它是用<#-- -->格式。和HTML注解不同的是,它不会输出(访问者在page sources中看不到它),因为freemarker会跳读这部分。
对于非FTL标签、非interpolation、非Comment,freemarker将视为静态文本,不会对其解译,只会原样输出。
关于FTL标签,我们就得提到所谓的directives. directives与FTL标签的关系就等同于Html标签(<table></table>)与Html元素(table元素)之间的关系。
这里提供给大家一个可以轻松编写template的网址:http://freemarker-online.kenshoo.com/
一些基本的directives:
接下来我们看一下一些基本的常用的directives,全部的directive看这里Directive Reference
1、if 指令
<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today.<#elseif animals.elephant.price < animals.python.price> Elephants are cheaper than pythons today.<#else> Elephants and pythons cost the same today.</#if>
2、list 指令
<ul><#list misc.fruits as fruit> <li>${fruit}</#list></ul>看这里,避免misc.fruits为空的情况,<ul></ul>依然会输出的问题,可以如下:
<#list misc.fruits> <ul> <#items as fruit> <li>${fruit} </#items> </ul></#list>除了上面提到的 item 指令,另外一个与list相关的常用指令:sep
Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, </#list>Fruits: orange, bananasep指令只有在有下一个值的时候才会输出,所以banana后没有逗号。
再看这里,如果misc.fruits为空怎么办?只打印fruit的话,空就不太合适了。其实list,就像if,可以有一个else指令:
<p>Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, <#else>None</#list>
综上所述,所有这些指令(list、item、sep、else)可以一起用:
<#list misc.fruits> <p>Fruits: <ul> <#items as fruit> <li>${fruit}<#sep> and</#sep> </#items> </ul><#else> <p>We have no fruits.</#list>
通过include指令,我们可以插入另一个文件内容到当前template。
料想我们需要在多个页面显示copyright通知,我们可以创建一个只包含copyright的文件,然后在任何我们需要copyright通知的地方插入这个文件。
<hr><i>Copyright (c) 2000 <a href="http://www.acmee.com">Acmee Inc</a>,<br>All Rights Reserved.</i>
<html><head> <title>Test page</title></head><body> <h1>Test page</h1> <p>Blah blah... <#include "/copyright_footer.html"></body></html>
使用built-ins(内置):
所谓的built-ins如同subvariables(或者相当于java术语中的methods),并不是来自于data-model中的subvariables,而是由freemarker添加到前面的值上的。
为了清晰subvariables的来源是built-ins还是data-model,我们必须用?(问号)替换 . (点)来访问这些subvariables。
下面列举一下最常用的built-ins :
1、user?upper_case :给出user的大写格式(如John,替换为JOHN)。
2、user?cap_first :给出user的首字母大写(如john,替换为John)。
3、user?length :给出user字符的长度(如,john,返回4)。
4、animals?size :给出animals sequences的items数量(上面sequences的data-model中数量是3。mouse、elephant、Python)。
5、如果是在<#list animals as animal>与对应的</#list>标签之间:
5.1、animal?index :给出基于0的animal在animals中的索引。
5.2、animal?counter :类似于index,只不过是基于1的索引。
5.3、animal?item_parity :根据当前counter的奇偶性,给出字符串“odd”(奇数)或“even”(偶数)。
-------通常用于渲染交替色的行,如<td class="${animal?item_parity}Row">
还有一些built-ins,需要传参:
6、animal.protected?string("Y", "N") :返回字符串“Y”或“N”,根据animal.protected的boolean值。
7、animal?item_cycle("lightRow", "darkRow") :较之前提到的item_parity,这个是更为通用的变量。
8、fruits?join(", ") :将list通过串联items转换成一个string,并在每个items间插入参数所指定的分隔符。如,“orange, banana”。
9、user?starts_with("J") :返回boolean值,根据user是否以J开头。
Built-in应用是可以使用串联方式调用的,如,fruits?join(", ")?upper_case 根据先后顺序依次执行,就像串联调用 . -s一样。
这里是全部的built-ins集合 Built-in Reference
处理变量缺失:
1、
<h1>Welcome ${user!"visitor"}!</h1>2、
<#if user??><h1>Welcome ${user}!</h1></#if>另外,animals.python.price!0 可能抛异常“undefined variable”,为避免应:(animals.python.price)!0
同样,animals.python.price??
应(animals.python.price)??
转义HTML、XML或其他标记:
如果正确配置了freemarker,freemarker会自动转换所有${...}打印的值。配置freemarker就是程序员的职责了,点击查看怎么配置
推荐的做法是通过 ftlh 扩展名来激活html的自动转义,ftlx 扩展名来激活xml的自动转义。
- FreeMarker 笔记
- freemarker笔记
- FreeMarker笔记
- freemarker 笔记
- FreeMarker笔记
- Freemarker笔记
- Freemarker笔记
- FreeMarker笔记
- freemarker 笔记
- freemarker笔记
- FreeMarker笔记
- freemarker笔记
- FreeMarker学习笔记
- FreeMarker学习笔记
- freemarker学习笔记
- Freemarker 学习笔记
- freemarker学习笔记
- FreeMarker struts2 笔记
- 小型互联网公司的一般架构
- C语言,从字符串中提取一个字符串,int substr(char dst[], char src[],int start,int len)目标是:从src数组的起始位置开始向后偏移star
- JavaScript 的闭包原理与详解
- morphia与spring的整合
- iOS开发:后台运行以及保持程序在后台长时间运行
- FreeMarker笔记
- linux命令打印字符串md5哈希后的值
- webpack shimming modules 引入第三方插件
- C#41课主要内容
- java线程安全总结
- Leetcode292.Nim Game
- hdu 2082-组合数学-找单词
- isql介绍
- 从标准输入读取字符,并把他们写的标准输出,除了大写字母转换为小写字母外,其他按原样输出