freemark 应用以及优势

在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标记混淆。

时间: 2024-10-26 10:16:12

freemark 应用以及优势的相关文章

云存储技术优势及其发展趋势的探讨

云存储技术优势及其发展趋势的探讨 1.引言 近年来,由于信息技术的发展,科学计算和商业计算等众多应用领域会产生了规模相当巨大的数据,并且数据量仍在快速增加,呈海量形式发展.在科学计算方面,如物理学.天文学.生物学等领域都会产生规模庞大的数据,而且每年的数据规模达到若干PB.而在商业计算方面,Web搜索.社会网络等需要处理的数据规模也非常庞大,例如,Google和Facebook等应用产生的数据达到PB甚至EB级.按照摩尔定律,处理器的速度每18个月就会翻一番,光纤技术的发展也大大加快了数据在网络

针对企业需求,Bluemix具有三大突出优势

1. 简单.快速:加速应用开发速度,缩短部署时间.Bluemix上来自IBM和第三方提供的大量可组合的产品,可供开发人员直接使用.BlueMix 提供的DevOps服务便于整个团队成员分享工作成果.开展协作.并通过性能监控来加快发现问题进行修改.完整的开发体验可以保证在高质量的前提下,加快产品上市速度. 2. 开放.灵活:基于开放标准开发,适应企业的个性化需求.Bluemix以开放标准为基础并且利用了Cloud Foundry,从而帮助开发人员避免被供应商绑定的问题,同时允许他们利用现有的应用开

Angular 1.0演变Angular 2.0的简单优势列举

首先,Angular最核心的4大特性分别是: 1.模块化 2.MVC 3.双向数据绑定 4.指令 Angular 1.0演变Angular 2.0的简单优势列举: 1.性能限制上的优化 说明:随着时间的推移,各种特性被加入进去以适应不同场景下的应用开发,在最初的架构受到了限制,而Angular 2.0很好的解决了这些问题. 2.仿照WEB后端的结构模式来编写前端 说明:支持模块.类.lambda表达式. generator等新的特性 3.支持移动端开发 说明:Angular1.x没有针对移动 应

认识JQuery,JQuery的优势、语法、多库冲突、JS原生对象和JQuery对象之间相互转换和DOM操作,常用的方法

(一)认识JQuery  JQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一套定义好的方法    JQuery的主旨:以更少的代码,实现更多的功能 (二)JQuery的优势 1)可以像CSS一样访问和操作DOM 2)修改CSS控制页面外观 3)简化JS代码操作 4)事件代理更加容易 5)动画效果使用方便 6) Ajax技术更加完美 7)大量的基于Jquery的插件 8)可以自定义扩展功能插件 (三)JQuery的语法 格式:$(selector).actio

细说ios开发和Android开发有什么区别?谁更有优势?

ios开发和安卓开发的市场分析:      首先iOS系统是应用在iPhone.iPad等高端设备上的,iOS市场占有的份额虽然不高,但是用户的消费能力比较强,生态圈较好有利于开发者直接获利.Android向大众人群普及,市场份额占有率虽然很高,但是用户群体的人均消费能力普遍弱,但是依托于用户的基数使得Android有资本跟iOS抢占市场份额. ios开发与安卓开发区别比较:      iOS:基于Unix闭源的操作系统,核心语言是Objective-C,相关的语言还有C语言(重点在数据结构和算

七牛的优势和便宜购买方法

既然推荐七牛,那么就得说说七牛的优势,在说之前给大家推荐一个七牛优惠码:61d1fd4d  优惠码是九折,1万以下99折,一万以上95折,目前七牛所有的优惠码都是统一折扣的,建议大家收藏使用,永久有效. 下面进入正题,七牛是目前国内数一数二的云存储厂商了,但不是第一个开始做这个的,既然能超越前人,肯定有其过人之处. 1.免费流量和额度 七牛每月都有一定的免费流量和额度,对于中小网站和个人来说,基本无成本.算是免费使用了,搭建一些中小个人网站完全够用. 2.cdn加速 网页静态资源优化加速分发,对

Docker 有什么优势?

1.什么是容器? 依托与linux 内核功能的虚拟化技术 2. docker 是什么? 能够把应用程序自动部署到容器的开源引擎 3. docker 跟原有的工具有何区别? 传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行: Docker的部署模式是:复制->运行. 4. docker 会对服务器端开发/部署带来什么变化? 实现更轻量级的虚拟化,方便快速部署  对于部署来说可以极大的减少部署的时间成本和人力成本 Docker支持将应用打包进一个可以移植的容器中,重新定义了

网络安全标准与 “腾讯模式”背后的海量大数据及技术优势

针对腾讯反电信网络诈骗的系列技术产品和成果进行考察.交流座谈中,腾讯公司董事会主席兼CEO马化腾首次提出了反电信网络诈骗的"腾讯模式",依托现代网络安全技术与大数据能力,联合全行业伙伴,开放合作共享,职能联动互通,形成对抗黑色产业链的联合反诈骗生态闭环.值得一提的是,"腾讯模式"的思路在企业安全领域也有体现,其背后的安全大数据积累将通过腾讯云开放,促进各行业安全能力的提升. 安全标准是网络安全工作重中之重 "网络安全标准作为网络安全保障体系的重要组成部分,

2.采用四象限法将你小组的四则运算软件的需求功能进行分类。阐述其优势与不足。------------答题人:张立鹏

如果把要做的事情按照紧急.不紧急.重要.不重要的排列组合分成四个象限,这四个象限的划分有利于我们对时间进行深刻的认识及有效的管理. 第一象限 这个象限包含的是一些紧急而重要的事情,这一类的事情具有时间的紧迫性和影响的重要性,无法回避也不能拖延,必须首先处理优先解决.它表现为重大项目的谈判,重要的会议工作等. 第二象限 这二象限不同于第一象限,这一象限的事件不具有时间上的紧迫性,但是,它具有重大的影响,对于个人或者企业的存在和发展以及周围环境的建立维护,都具有重大的意义. 第三象限 第三象限包含的