在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术需求产生了JSP等Scriptlet,JSP十分强大,但是也常常被滥用,并导致一些不良的后果

将逻辑和表现混合在一起。
破坏了美工和程序员职责的正常分解。
使JSP页面难以阅读和维护。
模板引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,我们称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码。
模板和嵌入JSP的HTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。
三万英尺俯瞰FreeMarker
简单的说,FreeMarker就是一种用Java编写的模板引擎,它根据模板输出多种规格的文本。特别指出的是,FreeMarker与Web应用框架无关,它同样可以应用在非Web应用程序环境中。

下面我们来看看FreeMarker的模板:(product.ftl)

<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的指令。

至于user、latestProduct.url和latestProduct.name的具体内容则来自于数据模型(data model)。数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成。

模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型。

借助FMPP(FreeMarker PreProcessor)来运行FreeMarker
首先说明的是FreeMarker的运行并不依赖于FMPP。FMPP只是一个FreeMarker的辅助工具,有了它,我们可以快速地调试FreeMarker输出结果,而不需要借助Java编程,这可以大大地减轻美工设计人员的调试难度。

在磁盘上建立相关的文件夹:

D:/work/src/product.ftl

D:/work/out/

D:/work/data/product.tdd

D:/work/config.fmpp
我们使用的配置文件(config.fmpp)设置如下:

sourceRoot: src

outputRoot: out

logFile: log.fmpp

modes: [

copy(common/**/*.*, resource/*.*)

execute(*.ftl)

ignore(templates/*.*, .project, **/*.xml, xml/*.*, *.js)

]

replaceExtensions: [ftl, html]

sourceEncoding: gb2312

data: tdd(../data/product.tdd)
注意:"data: tdd(../data/product.tdd)" 指定了模板的数据源,TDD是fmpp支持的数据格式之一 ,关于TDD介绍可参阅fmpp文档,也可参看TDD 。product.tdd内容是这样的:

{

user: "Big Joe"

latestProduct: {url: "products/greenmouse.html"
, name: "Green Mouse"
}

}
现在在dos下执行(假设FMPP安装在D:/FMPP下):

D:/work/>D:/FMPP/bin/fmpp
最后的输出结果是这样的,存放在文件out/product.html中:

<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>
正如FreeMarker文档中所叙述的,FreeMarker的工作原理就是:

模板+数据=输出!

FreeMarker并不局限于生成html,甚至可以产生java代码,这仅仅取决于你如何设计模板而已。

现在有了FMPP这个强大工具,我们接下来可以快速学习FreeMarker的相关指令。let us go!

在FreeMarker模板中使用的三种基本对象类型:Scalars、Hashes 和Sequences。在解释这些对象类型之前,我们先来看看数据模型。

典型的数据模型是树型结构,可以有任意深的层次,比如说:

(root)

|

+- animals

|   |

|   +- mouse

|   |   |

|   |   +- size = "small"

|   |   |

|   |   +- price = 50

|   |

|   +- elephant

|   |   |

|   |   +- size = "large"

|   |   |

|   |   +- price = 5000

|   |

|   +- python

|       |

|       +- size = "medium"

|       |

|       +- price = 4999
这棵树上的每一片叶子在FreeMarker中就称为Scalars,用来存储单值。Scalars保存的值 有两种类型:字符串(用引号括起,可以是单引 号或双引号)、数字(不要用引号将数字括起,这会作为字符串处理)、日期和boolean值。对scalars的访问要从root开始,各部分用“.”分 隔,如animals.mouse.price。

树的每一个分支关联一个唯一的查询名字,例如“mouse”,“elephant”,这些分支充当了其他对象(size,price)的容器,这种结构则称为Hashes,参考Hashes的TDD定义 。

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
可以通过animals[0].name来访问相应的Scalars。参考Sequences的TDD定义

针对上面三种对象类型的操作,可以参看对象类型的各种操作

模板与指令
除了相关的文本外,在FreeMarker模板中可以包括下面三种特定部分:

${…}:称为插补(interpolations),FreeMarker会在输出时用实际值进行替代。
指令:也叫FreeMarker标记,与HTML标记类似,但用#开始(有些以@开始 ,在后面叙述)。
注释:包含在<#-- 和 -->(而不是<!--和-->)之间文本。
控制指令
if指令
if指令与大部分程式语言一样,也支持<#else if..>,不再赘述。

<#if
animals.python.price < animals.elephant.price>

Pythons are cheaper than elephants today.

<#else
>

Pythons are not cheaper than elephants today.

</#if
>
list指令
list指令将遍历Sequences里的每一个元素。list指令有两个隐含的特殊变量:

item_index 该变量将返回元素在Sequences里的索引值。
item_has_next 该变量是boolean型,false表明该元素是Sequences里的最后一个元素。
<p>We have these animals:

<table border=1>

<tr><th>Id<th>Name<th>Price

<#list animals as being>

<tr><td>${being_index+1}<td>${being.name}<td>${being.price} Euros

</#list>

</table>
上面的模板可以依次列印出三种动物的名字和价格,being_index和being_has_next则是它的特殊变量。

可以用<#break>指令提前结束list循环。

switch指令
与其他语言的switch语句类似。

<#switch
being.size>

<#case
"small"
>

This will be processed if
it is small

<#break
>

<#case
"medium"
>

This will be processed if
it is medium

<#break
>

<#case
"large"
>

This will be processed if
it is large

<#break
>

<#default
>

This will be processed if
it is neither

</#switch
>
注意事项
FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的
Interpolation只能在文本中使用
FTL标记不能位于另一个FTL标记内部。
注释可以位于FTL标记和Interpolation内部。
多余的空白字符会在模板输出时移除
可用[#if..]来替代<#if..>,避免于HTML标记混淆。

转载于:https://blog.51cto.com/10692754/1691900

freemark 应用以及优势相关推荐

  1. ALD对照CVD淀积技术的优势

    ALD对照CVD淀积技术的优势 ALD 适合制备很薄的高K金属氧化物层,对腔室的真空度要求比较高,对反应气体源及比例的要求也较高. 目前沉积速率还是比较慢,大大限制了其在工业上的推广应用,不过随着设备 ...

  2. 机器学习PAL产品优势

    机器学习PAL产品优势 PAI支持丰富的机器学习算法.一站式的机器学习体验.主流的机器学习框架及可视化的建模方式.本文介绍PAI的产品优势. 丰富的机器学习算法 PAI的算法都经过阿里巴巴集团大规模业 ...

  3. 2019个嵌入式市场研究,持续的C/C++优势

    2019个嵌入式市场研究,持续的C/C++优势 2019 Embedded Markets Study reflects emerging technologies, continued C/C++ ...

  4. 如何找到自己的优势并坚定信念执行下去

    来源于网络,若侵权请联系删除 在生活中学会不断挖掘自己的潜力.我们都是一个普通人,可能并不清楚自己到底在哪方面占有优势.所以,学着在生活中找到自己的优势,并根据优势选择一定的就业方向. 不随波逐流.不 ...

  5. 计算机检索的优点,专利检索与分析系统拥有哪些优势?

    专利检索与分析系统拥有哪些优势?现在很多朋友都在了解专利检索与分析系统又有哪些优势,因为他们需要使用这些系统,不少朋友都会利用业余时间搞各种发明专利,并申请发明专利,在申请之前,人们就需要对专利进行检 ...

  6. 计算机金融交叉学科考研,22考研:交叉学科可能成为新选择!它有哪些优势?

    2022考研的考生已经进入备战状态,近日,教育部官网公布增设了一个"交叉学科"门类(门类代码为"14").不少考研新手咨询什么是交叉学科?选择交叉学科有哪些优势 ...

  7. 黑龙江科技大学计算机类分数线,2019年黑龙江科技大学优势专业排名及分数线...

    [www.altdl.com.cn--黑龙江] 2018年本站提醒每个考生,填报志愿时候必须注意每个大学都有自己的优势专业和特色专业,是主要和最擅长教育出这种特色专业方面的人才的,也是这个大学比较好的 ...

  8. C语言优势大揭露,你还在等什么呢?

    有道是,0生1,1生C,C生万物. C语言,有太多的优势! 1.简洁紧凑.灵活方便 2. 运算符丰富 3.数据结构丰富 4.属于结构式语言 5.语法限制不太严格.程序设计自由度大 6.允许直接访问物理 ...

  9. nio的优势_NIO研究所 | 最有AI的EC6故事

    随着EC6的交付开启,在大定盲盒活动中抽到"飞行嘉宾"交付的用户,也陆续和他们的专属"交付专员"见面了,先分享一波有爱的EC6提车现场? << 左右 ...

  10. wpf 多线程处理同步数据_一文带你理解多线程的实际意义和优势

    多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制. 多线程指从软件或者硬件上实现多个 ...

最新文章

  1. DR模式下的mysql (abb读写分离)
  2. MySQL5.7.17绿色版安装
  3. 当我谈跑步时我谈些什么——村上春树
  4. 支持向量机实现鸢尾花数据集分类matlab
  5. innodb_flush_method理解【转】
  6. 总结了一下初学者对Go错误处理的四个误解!
  7. 不定长数组取值交叉遍历组合生成算法
  8. windows c++版faster-rcnn
  9. 【干货】2021年重点行业薪酬趋势指南.pdf(附下载链接)
  10. 多线程日记(17.5.3)
  11. 1 Linux防火墙设置
  12. android 银行卡号 4位,Android中控制银行卡号的输入 即4个数字空一格
  13. 论文阅读:Region Proposal by Guided Anchoring
  14. https访问出现无法访问此网站
  15. java+websocket实现网页聊天室
  16. flume系列之:监控JMX reporter
  17. iOS 应用内购买(In-App Purchase)之开发
  18. 长沙举办智慧城市供应链沙龙
  19. JavaScript中如何严格的判断NaN
  20. 苹果手机短信如何转入Android手机,苹果手机怎么将短信备份导入到安卓手机?...

热门文章

  1. OpenCV Show Image cvShowImage() 使用方法
  2. 关于JSP post请求乱码的问题
  3. Vmware中RedHat命令行和图形界面切换
  4. 服务器端 viewstate
  5. python_tornado
  6. Animation in Windows 8 apps
  7. php mssql 分页SQL语句优化 持续影响
  8. R语言ETL工程:集合运算(intersect/union/setdiff)
  9. 关于程序猿的六个问答题
  10. 树莓派 - 蓝牙 (1) 试试Beacon