作者:empty 页数:293 出版社:empty |
前言什么是FreeMarker?FreeMarker是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于HTML格式的文本用来自动生成源代码) 的通用工具、它是为Java程序员提供的一个开发包.或者说是一个类库。它不是面向最终用户的,而是为程序员提供的一款可以嵌入他们所开发产品的应用程序。FreeMarker实际上是被设计用来生成HTML页面, 尤其是通过实现了基于MVC(ModelView Controller, 模型-视图-控制器) 模式的Java Servlet应用程序, 使用MVC模式的动态页面的设计构思使得你可以将前端设计师(编写HTML页面的人员) 从程序员中分离出来, 那么,所有人各司其职,发挥其最擅长的一面。网页设计师可以改写页面的显示效果而不受程序员编译代码的影响, 因为应用程序的逻辑(这里是Java程序) 和页面设计(这里是FreeMarker模板)已经被分开了,页面模板代码不会受到复杂程序代码的影响。这种分高的思想即便对一个程序员和页面设计师是同一个人的项目来说也都是非常有用的,因为分离使得代码保持简洁而且易于维护.语言。反而, Java程序准备的数据来进行显示(比如SQL数据库查询) .FreeMarker仅仅是使用模板生成文本页面来呈现已经准备好的数据而已。尽管FreeMarker也拥有一些编程能力, 但是它却不像PHP那样, 是的一种全面的编程FreeMarker不是Web开发的应用程序框架, 它是一个适用于Web应用程序框架中的组件, 但是FreeMarker引擎本身并不知道HTTP协议或lava Servlet的存在, 它仅仅来生成文本内容.既然是这样, 它也非常适用于非Web应用程序的开发环境.只是要注意的是, 我们使用FreeMarker作为视图层的组件.是为了给诸如Struts这样的Model 2应用框架提供现成的解决方案。
前端设计师,首先,你应该阅读的是模板开发指南部分,然后如果有需要的话,可以再程序员,那么,你应该先阅读模板开发指南部分,然后是程序开发指南部分,最后如果本文档规约变量名, 模板代码段, Java类名等用如下格式书写, 如:foo。如果需要具体值来代替某些内容, 那么用斜体书写, 如:Hello your Name!模板示例如下书写数据对象示例如下书写:输出数据示例如下书写:在面向页面设计师和程序员所编写的章节中代码段给程序员这样写:这只是对程序员而言的.这样来强调新名词:一些新名词
概括地讲, 模板和数据模型是FreeMarker所需, 并用来生成输出内容的(比如之前展正如你看到的,数据模型基本结构是树状的。这棵树可以复杂而且有很大的深度,比如:上图中变量扮演目录的角色(根root.animal.mouse, elephant, python,如果要在模板中使用子变量, 那应该从根root开始指定它的路径, 每级之间用点来分sequences序列也是一种非常重要的变量, 它们和哈希表变量相似, 但是它们不存储所人来访问这个页面, FreeMarker将会介入执行, 然后动态转换模板, 用最新的数据内容替换模板中S 4} 的部分(例如:用Big Joe或者其他的访问者的用户名来代替S{user} ) , 生成普通的HTML文本并发送结果到访问者的Web浏览器中去显示。所以访问者的Web浏览器会接收到类似于第一个HTML示例的内容(也就是说, 显示普通的HTML文本而没有FreeMarker的指令) , 因为浏览器也不会感知到FreeMarker在服务器端被调用了, 模板文件本身(存储在Web服务器端的文件) 在这个过程中也不会改变什么, 所以这个转换过程发生在一次又一次的访问中。这样就保证了显示的信息总是即时的,现在,也许你己经注意到,该模板并没有包含关于如何找出当前的访问者是谁,或者是如何去查询数据库中查找最新的产品的指令,它似乎己经知道了这些数据是什么,事实也确实是这样的, 在FreeMarker背后(确切的说是在MVC模式的背后) 的重要思想就是表现逻辑和业务逻辑相分离。在模板中,只是处理显示相关的问题,也就是视觉设计问题和格式问题。所准备要显示的数据(如用户名等) 与FreeMarker无关, 这通常是使用Java语言或其他目的语言来编写的程序。所以模板开发人员不需要关心这些故值是如何计算出来的。事实上,在模板保持不变的同时,这些数值的计算方式可以发生根本的变化。而且,除了模板外,页面外观发生的变化可以完全不触碰其他任何东西.当模板开发人员和程序员是不同一个人的时候,分离帝来的好处更是显而易见的。FreeMarker(还有模板开发人员) 并不关心数据是如何计算出来的, FreeMarker只是知道真实的数据是什么。模板能用的所有数据被包装成data-model数据模型, 数据模型的创建是通过口经存在的程序计算得到的。至于模板开发人员,数据模型像是树形结构(比如硬盘上的文件夹和文件),正如本例中的数据模型,就可以如下形式来描述:(root)(为了免误解:数据模型并不是文本文件,上面所描述的只是一种数据模型的表现形式,它来自于Java对象, 但这会成为Java程序员要面对的问题, )比较之前你在模板中看到的fuser} 和车(latest Product.name} 。作为一种比喻:数据模型就像计算机文件系统上的内容:根root和latest Product对应目录(文件夹) , user, url和name对应文件。url和name在latest Product目录中, 所以latest Product.name就像是说latest Product目录的name一样.但是我所说的,这仅仅是个比响。这里并没有真实的文件和目录。示的HTML) :模板+数据模型=输出
可以使用数组的方括号方式来访问一个序列的子变量.索引从零开始(从零开始是程序员写代码的传统习惯),那么就意味着序列第一项的索引是0.第二项的索引是1.并以此类推。要得到第一个动物的名称的话, 那么就应该这么写代码:animals[01.name。要得到what not.fruits(就是 banana 这个字符串) 的第二项, 那么就应该这么来写:what not, fruits[11.字符串:这是文本类型,字符的任意序列,比如“m ,“o ,“u*,“s ,“e~这些,而且name-s和size-S也是字符串范畴。数字:这是数字值类型, 比如price-S这些。在FreeMarker中字符串“50*和数字50是两种完全不同的类型。前者只是两个字符的序列(这恰好是我们可以读的一个数字),而后者是一个可以在算数运算中直接被使用的数值。日期/时间;这是时间日期类型。例如动物被捕捉的日期,或商店开始营业的时间。布尔值:对应对/错(是/否,开/关等)这样仅仅代表正反的值。比如动物可以有一个受保护(protected.译者注) 的子变量, 这个变量存储这个动物是否被保护起来.其他任何不是FTL标签, 插值或注释的内容将被视为静态文本, 这些东西就不会被标量存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值。哈希表是存储变量和与其相关且有唯一标识名称变量的容器。序列是存储有序变量的容器-存储的变量可以通过数字索引来检索,索引通常从零开始.
1.4模板一览
1.4.1简介
最简单的模板是普通HTML文件(或者是其他任何文本文件-FreeMarker本身不属于HTML) , 当客户端访问页面时, FreeMarker要发送HTML代码至客户端浏览器端显示, 如果想要页面动起来, 就要在HTML中放置能被FreeMarker所解析的特殊部分。$[.) :FreeMarker将会输出真实的值来替换花括号内的表达式, 这样的表达式被称为interpolations插值, 可以参考第上面示例的内容FTL tags标签(FreeMarker模板的语言标签) :FTL标签和HTML标签有一点相似, 但是它们是FreeMarker的指令而且是不会直接输出出来的东西.这些标签的使用一般以符号#开头.(用户白定义的FTL标签使用@符号来代替#, 但这是更高级的主题内容了, 后面会详细地讨论)Comments注释:FreeMarker的注释和HTML的注释相似, 但是它用 #--和-->来分隔的。任何介于这两个分隔符(包含分隔符本身) 之间内容会被FreeMarker忽略, 就不会输出出来了。FreeMarker所解析, 会被按照原样输出出来directives指令; 就是所指的FTL标签。这些指令在HTML的标签(如 table>和 /table>) 和HTML元素(如table元素) 中的关系是相同的, (如果现在你还不能区分它们, 那么把“FTL标签”和“指令”看做是同义词即可, )1.4.2指令示例尽管FreeMarker有很多指令, 作为入门, 在快速了解过程中我们仅仅来看三个最为常用的指令.
FreeMarker中文用户手册_用于FreeMarker 2.3.19_南磊译. ..FreeMarker
1.1简介.
1.3数据模型一览..
1.4模板一览.
2.1基本内容..
2.2类型..
3.1总体结构.
3.2指令..
3.3表达式..
3.4插值..
4.1自定义指令..
4.2在模板中定义变量..
4.3命名空间.
4.4空白处理.
1.1创建配置实例.
1.2创建数据模型.
1.4合并模板和数据模型.
1.5将代码放在一起.
2.1基本内容..
2.2标量..
2.5指令..
2.6节点变量.
2.7对象包装..
什么是FreeMarker?..7
我们应该阅读什么内容?.8
文档规约..8
联系我们.8
几点说明.9
第一章模板开发入门.10
1.2模板+数据模型=输出..
第二章数值和类型..
第三章模板..
第四章其它..
4.5替换(方括号)语法..
1.3获得模板..
第二章数据模型.
2.3容器.
2.4方法..
Commons Attribution 3.0Un ported License(seehttp://creativecommons.org/licenses/by/3.0/) ,
Manual
版权说明:
FreeMarker中文版手册由南磊翻译, 本文档基于CreativeCommons Attribution 3.0
Un ported投权许可(参见http:/creativecommons.org/icenses/by/3.0/deed.zh)
(译者联系方式为:nan lei 1987@gmail com或http//weibo.com/nanlei1987)
目录
前言.7
第一部分模板开发指南..10
第二部分程序开发指南..
第一章程序开发入门..
第三章配置..
3.1基本内容.
3.2共享变量.
3.3配置信息.
3.4模板加载..
3.5错误控制.
第四章其它..
4.1变量.
4.2字符集问题..
4.3多线程.
4.4Bean的包装.
前言.
4.5日志.
4.6在Servlet中使用FreeMarker..
4.7为FreeMarker配置安全策略.
4.8遗留的XML包装实现.
4.9和Ant一起使用FreeMarker.
4.10Jython包装器.
1.1节点树..
1.2将XML放到数据模型中..
2.1通过例子米学习.
2.2形式化描述..
3.1基础内容.
3.2详细内容..
1.1处理字符串的内建函数..
1.2处理教字的内建函数.
1.3处理日期的内建函数..
1.4处理布尔值的内建函数.
1.5处理序列的内建函数.
1.6处理哈希表的内建函数..
1.7处理节点(XML) 的内建函数.
1.8很少使用的和专家级的内建函数.
2.1if, else, elseif指令
2.2 switch, case, default, break指令..
2.3 list, break指令..
2.4 include指令..
2.5 import指令.
2.6noparse指令..
2.7 compress指令..
2.8 escape, no escape指令.
2.9assgn指令..
2.10 global指令.
2.11 local指令..
2.12 setting指令..
2.13用户自定义指令( @..>)
2.14macro, nested, return指令..
2.15 function, return指令.
2.16flush指令..
2.17stop指令..
2.18tl指令..
2.19t,It,rt指令..
2.20nt指令..
2.21 attempt, recover指令.
2.22 visit, recurse, fallback指令.
第三章特殊变量参考文档.
5.1废弃的指令列表..
5.2废弃的内建函数列表.
5.3老式的macro和call指令.
5.4转换指令..
5.5老式FTL语法.
附录A FAQ..
第三部分XML处理指南.
第一章揭示XML文档..
第二章必要的XML处理..
第三章声明的XML处理.
第四部分参考文档.
第一章内建函数参考文档..
第二章指令参考文档..
第四章FTL中的保留名称.
第五章废弃的FTL结构.
第五部分附录..
5.6.-.)式的数字插值..
1.J5P和FreeMarker的对比..
2.Velocity和FreeMarker的对比..
3.为什么FreeMarker对null-s和不存在的变量很敏感, 如何来处理它?..215
4.文档编写了特性X, 但是好像FreeMarker并不知道它, 或者它的行为和文档描
述的不同, 或者一个据称已经修改的BUG依然存在。.216
5.为什么FreeMarker打印奇怪的数字数字格式(比如1000, 000或1000000而不
是1000000)?.216
6.为什么FreeMarker会打印不好的小数和/或分组分隔符号(比如3.14而不是3, 14)
---..----217
7.为什么当我想用如格式打印布尔值时, FreeMarker会抛出错误, 又如何来修正
呢?.217
8.FreeMarker标签中的 和>混淆了编辑器或XML处理器, 应该怎么做?.217
9.什么是合法的变量名?.-217
10.如何使用包含空格,或其他特殊字符的变量(宏)名?.218
11.当我试图使用JSP客户标签时为什么会得到非法参数异常:形式参数类型不匹
配?.218
12.如何像jap:include一样的方式引入其它的资源?..
如何给普通Java方法/