- 浏览: 773017 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (208)
- Java (77)
- JavaScript (16)
- UML (1)
- Spring (24)
- Hibernate (11)
- J2EE部署 (18)
- 操作系统 (13)
- struts (11)
- jsp (3)
- J2EE (34)
- 数据库 (22)
- tomcat (4)
- apache (2)
- MyEclipse (13)
- Linux (14)
- Ext (6)
- Weblogic (2)
- 数据库 Oracle 空表导出 (1)
- Oracle (3)
- 编码 乱码 (1)
- 多线程 (5)
- jQuery (2)
- Apache Mina (1)
- ibatis (6)
- abator (1)
- svn (1)
- jvm (1)
- ERwin (2)
- mysql (2)
- ant (1)
- memcache (1)
- dubbo (1)
- PowerDesigner (1)
最新评论
-
di1984HIT:
Shallow heap & Retained heap -
tinguo002:
非常感谢 , 太棒了。
Spring注解方式,异常 'sessionFactory' or 'hibernateTemplate' is required的解决方法 -
白天看黑夜:
Apache Mina Server 2.0 中文参考手册(带 ...
Apache Mina – 简单的客户端/服务端应用示例 -
wumingxingzhe:
好文
Shallow heap & Retained heap -
di1984HIT:
学习了!!
工作流(Workflow)和BPM的不同
在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。
很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术需求产生了JSP等Scriptlet,JSP十分强大,但是也常常被滥用,并导致一些不良的后果
1. 将逻辑和表现混合在一起。
2. 破坏了美工和程序员职责的正常分解。
3. 使JSP页面难以阅读和维护。
模板引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,我们称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码。
模板和嵌入JSP的HTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。
三万英尺俯瞰FreeMarker
简单的说,FreeMarker就是一种用Java编写的模板引擎,它根据模板输出多种规格的文本。特别指出的是,FreeMarker与Web应用框架无关,它同样可以应用在非Web应用程序环境中。
下面我们来看看FreeMarker的模板:(product.ftl)
这个例子是在简单的HTML中加入了一些由${…}包围的特定代码,这些特定代码就是FreeMarker的指令。
至于user、latestProduct.url和latestProduct.name的具体内容则来自于数据模型(data model)。数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成。
模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型。
借助FMPP(FreeMarker PreProcessor)来运行FreeMarker
首先说明的是FreeMarker的运行并不依赖于FMPP。FMPP只是一个FreeMarker的辅助工具,有了它,我们可以快速地调试FreeMarker输出结果,而不需要借助Java编程,这可以大大地减轻美工设计人员的调试难度。你可以从:>>http://fmpp.sourceforge.net/ 得到它。
在使用Freemaker的时候,我们需要下载相关的程序:
freemarker: >>http://freemarker.sourceforge.net/
在磁盘上建立相关的文件夹:
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中:
正如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模板中可以包括下面三种特定部分:
1. ${…}:称为插补(interpolations),FreeMarker会在输出时用实际值进行替代。
2. 指令:也叫FreeMarker标记,与HTML标记类似,但用#开始(有些以@开始,在后面叙述)。
3. 注释:包含在<#-- 和 -->(而不是<!--和-->)之间文本。
控制指令
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指令有两个隐含的特殊变量:
1. item_index 该变量将返回元素在Sequences里的索引值。
2. 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>
注意事项
1. FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的
2. Interpolation只能在文本中使用
3. FTL标记不能位于另一个FTL标记内部。
4. 注释可以位于FTL标记和Interpolation内部。
5. 多余的空白字符会在模板输出时移除
6. 可用[#if..]来替代<#if..>,避免于HTML标记混淆。
很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术需求产生了JSP等Scriptlet,JSP十分强大,但是也常常被滥用,并导致一些不良的后果
1. 将逻辑和表现混合在一起。
2. 破坏了美工和程序员职责的正常分解。
3. 使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编程,这可以大大地减轻美工设计人员的调试难度。你可以从:>>http://fmpp.sourceforge.net/ 得到它。
在使用Freemaker的时候,我们需要下载相关的程序:
freemarker: >>http://freemarker.sourceforge.net/
在磁盘上建立相关的文件夹:
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模板中可以包括下面三种特定部分:
1. ${…}:称为插补(interpolations),FreeMarker会在输出时用实际值进行替代。
2. 指令:也叫FreeMarker标记,与HTML标记类似,但用#开始(有些以@开始,在后面叙述)。
3. 注释:包含在<#-- 和 -->(而不是<!--和-->)之间文本。
控制指令
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指令有两个隐含的特殊变量:
1. item_index 该变量将返回元素在Sequences里的索引值。
2. 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>
注意事项
1. FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的
2. Interpolation只能在文本中使用
3. FTL标记不能位于另一个FTL标记内部。
4. 注释可以位于FTL标记和Interpolation内部。
5. 多余的空白字符会在模板输出时移除
6. 可用[#if..]来替代<#if..>,避免于HTML标记混淆。
发表评论
-
Eclipse,javaw 通过Proxifile代理ipv6协议问题解决
2015-03-17 18:06 2798myeclipse2010升级到myeclipse2014之后 ... -
初始化EHcache CacheManager时报java.net.UnknownHostException
2014-11-13 11:45 12510工程启动时,报一下异常: [wdfportal] [201 ... -
tomcat7可能带来的问题
2013-06-27 00:31 9841、struts标签校验更加严格,如果struts标签中存在嵌 ... -
iBatis执行insert后返回主键
2013-01-18 23:55 1652iBatis插入数据后,返回主键。级联操作很有用。省去了一次的 ... -
Shallow heap & Retained heap
2012-05-16 17:09 49331所有包含Heap Profling功能的工具(MAT, You ... -
Abator —— IBatis 代码生成工具
2012-04-03 18:31 19361、在eclipse安装abator插件http://ibat ... -
使用Eclipse远程调试Tomcat
2012-03-23 22:56 1512有些时候,调试不得不用外网,比如说做支付宝的支付接口,服务器后 ... -
Java compiler level does not match the version of the installed Java project fac
2012-03-02 11:32 1322问题现象:项目图标报错“Java compiler level ... -
WebService的事务处理
2012-03-01 15:03 1562如果你只是要解决两个系统之间的事务同步问题,可以采用判断服务是 ... -
线程池(java.util.concurrent.ThreadPoolExecutor)的使用
2012-02-29 15:50 2509一、简介 线程池类为 j ... -
myeclipse 颜色设置(保护视力)
2012-02-28 09:29 20911.window -> Preferences -> ... -
Quartz表达式解析
2012-02-08 14:40 809字段 允许值 允许的特 ... -
使用iBatis中报 java.sql.SQLException: 无效的列类型异常
2011-12-15 14:46 2244<!--Content表 插入应的 ... -
非常有用的proxool属性详细解说
2011-12-13 16:19 1612Proxool连接池是sourceforge下的一个开源项目, ... -
在工程中查找自己修改的所有代码
2011-12-09 17:41 1049在工程中查找自己修改的所有代码的方法: 1.工程右键 -&g ... -
如何在Eclipse中安装和使用ibatis插件Abator
2011-12-01 21:26 49761、获得abator: http://ibatis. ... -
newCachedThreadPool线程池
2011-11-20 11:35 43037public static ExecutorService n ... -
Apache Mina – 简单的客户端/服务端应用示例
2011-11-19 23:49 5530转自http://javasight.net/2011/05/ ... -
Class.forName()、Class.forName().newInstance() 、New 三者区别!
2011-11-15 09:18 1263终于明白为什么加载数据库驱动只用Class.forName() ... -
Apache MINA 快速入门指南
2011-11-13 12:04 1662最近用到Socket套接字编程,在服务器监听方面还没有具体思路 ...
相关推荐
在“Freemarker教程+中文版.pdf”这份文档中,你将会详细了解到如何配置和初始化Freemarker,如何创建和解析模板,以及如何处理模板错误。教程还会深入讲解Freemarker的高级特性,如宏、指令、模板继承和布局等,...
### FreeMarker教程精要 **FreeMarker** 是一种强大的模板引擎,主要用于生成动态网页或用于任何文本输出场景。本文档将深入探讨FreeMarker的核心组成部分及其使用方法,包括文本、注释、插值以及FTL(FreeMarker ...
Freemarker是一款强大的模板引擎,用于将数据模型与表示层分离,从而实现在Web开发中的动态页面生成。根据所提供的文件信息,我们可以详细探讨以下几个关键的知识点: ### 1. 创建配置实例 在Freemarker中,`...
`Freemarker教程 中文版.pdf`是一份详细的中文教程,将指导你掌握以下关键知识点: 1. **模板设计模式**:了解如何定义模板的结构,包括基本的文本、注释、变量和表达式。 2. **控制结构**:学习如何使用条件语句...
### Freemarker教程中文版知识点详解 #### 一、FreeMarker简介与快速入门 **知识点1:FreeMarker概述** Freemarker是一款用Java编写的模板引擎,它的主要功能是从模板(text-based templates)生成文本输出。这...
这个“FreeMarker教程中文版”提供了全面的学习资源,帮助开发者深入理解和应用FreeMarker。 FreeMarker的核心概念是模板和数据模型。模板是HTML或其他文本文件,其中包含一些特定的FreeMarker指令,用于动态插入由...
3. **教程手册**:《Freemarker教程手册中文版》是学习Freemarker的重要参考资料,涵盖了从入门到进阶的全面内容。 通过这个教程,你可以系统地了解和掌握Freemarker的使用方法,提升你的Web开发技能。在实践中不断...
### Freemarker教程中文版知识点详解 #### 一、FreeMarker简介 - **定位与功能**:FreeMarker是一款基于模板的文本生成工具,主要用于生成各类文本输出,如HTML、XML、RTF、Java源代码等。它由纯Java编写,因此可以...
### FreeMarker教程知识点 #### 一、快速入门 - **创建配置实例** 在使用FreeMarker时,首先需要创建一个Configuration实例,这是存放FreeMarker配置信息的重要对象。在应用系统生命周期中(如servlet),只需...
总之,FreeMarker教程+中文版是一个全面的学习资源,涵盖了从基础到高级的所有主题,适合初学者和经验丰富的开发者。通过学习,你可以掌握如何有效地使用FreeMarker构建动态、高效的Web应用界面。
Java生成word文档Freemarker教程 详细说明文档,帮组文档
### Java模板引擎Freemarker教程知识点详解 #### 一、FreeMarker概述 FreeMarker是一个用于生成输出文本的模板引擎,其应用广泛,特别是在Java应用程序中作为视图层的一部分。它支持多种类型的输出文本,包括HTML、...
### Freemarker教程详解 #### FreeMarker概述 FreeMarker是一个基于模板的文本生成工具,主要功能是根据提供的数据和模板来生成各类文本输出,比如HTML网页、XML文档等。该工具完全采用Java语言编写,适用于各种...
本教程将深入讲解Freemarker的核心概念、语法和实际应用,帮助你全面掌握这个模板语言。 1. **Freemarker简介** - Freemarker是一个开源的、轻量级的模板引擎,其核心功能是将数据模型与HTML模板结合,生成最终的...
综上所述,Freemarker教程中文版PDF将涵盖以上知识点,并可能包括更多实践案例和深入解析,帮助读者全面理解和掌握Freemarker的使用。通过学习,开发者能够熟练地利用Freemarker构建高效的模板系统,提高Web应用的...
在Freemarker教程中,你将深入了解到以下几个核心概念和知识点: 1. **模板语言**:Freemarker使用简单的文本模板语言,其语法由“控制结构”(例如条件语句和循环)和“数据引用”(用于显示数据模型中的值)组成...