<script type="text/javascript"> </script>
一.Freemarker简介 什么是Freemarker:. Freemaker是一个”模板引擎”,也可以说是一个基于模板技术的生成文本输出的一个通用工具.它是一个JAVA的包,一个JAVA程序员可以使用的类库.本身并不是一个对最终用户的应用程序.但是,程序员可以把它应用到他们的产品中. FreeMarker是设计为可以生成WEB PAGES.它是基于SERVLET遵循MVC模式的.这个思路是应用MVC模式要降低分离,网页设计人员和程序员的耦合.每个人都可以做他们擅长的工作.网页设计人员可以改变网页的面貌,而并不需要程序员的重新编译.因为业务逻辑和页面的设计已经被分离开了.模板是不能由复杂的程序片断组成的.即便网页设计人员和程序员是一个人.分离是有必要的.它能使程序更加的灵活和清晰. 虽然Freemarker能编程,但是它并不是一个编程语言.它是为程序显示数据而准备的.(像数据库SQL语句的查询.)以及.Freemarker仅仅是利用模板加上数据生成文本页面. Freemarker并不是一个WEB应用程序框架.可以说是一个WEB应用框架的一个组件.但是FREEMARKER引擎本身并不了解HTTP或者SERVLETS.它只不过生成文本而已.注意,它是MVC框架的一个组件(如STRUTS),也可以在模板中使用JSP标签.
Freemarker下载地址为:http://www.freemarker.org/index.html 一般的用途: l能用来生成任意格式的文本:HTML,XML,RTF,JAVA源码,等等. l可以更好的嵌入到你的产品中,轻量级的.并不需要servlet环境.不依赖javax.servlet.classes. l可插入的模板读取器:你可以从任意的源码读取任意的模板.本地的文件,数据库等等. l你可以做任意你想生成的文本.存储为本地文件.可以用来发送EMAIL或返回到WEB浏览器中.
强大的模板语言 l完整的指令:include,if/elseif/else,loop. l 建立和修改模板中的变量. l能用复杂的表达式在任意地方指定变量. n字符串操作:concateration,sub-string,uppercase,capitalize,escaping.等等 n十进制数学计算. nBOOL n读取数组和相关的数组元素. n可以自己添加特殊的计算方法. l宏指令 l命名空间用来创建和维护宏指令库或者把大的项目分成许多模块.并不用担心命名冲突
二.环境搭建与配置 <!—freemarker初始配置-->
<servlet> <servlet-name>freemarker</servlet-name> <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class> <init-param> <param-name>TemplatePath</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>NoCache</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>ContentType</param-name> <param-value>text/html</param-value> </init-param> <init-param> <param-name>template_update_delay</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>default_encoding</param-name> <param-value>GBK</param-value> </init-param> <init-param> <param-name>locale</param-name> <param-value>zh_CN </param-value> </init-param> <init-param> <param-name>number_format</param-name> <param-value>0.##########</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>freemarker</servlet-name> <url-pattern>*.ftl</url-pattern> </servlet-mapping>
---------------------------------------------------------------------------- 三.常用语法 EG.一个对象BOOK 1.输出${book.name} 空值判断:${book.name?if_exists }, ${book.name?default(‘xxx’)}//默认值xxx ${ book.name!"xxx"}//默认值xxx 日期格式:${book.date?string('yyyy-MM-dd')} 数字格式:${book?string.number}--20 ${book?string.currency}--<#-- $20.00 --> ${book?string.percent}—<#-- 20% --> 插入布尔值:
2.逻辑判断 a: <#elseif condition2>... <#elseif condition3>...... <#else>... 其中空值判断可以写成<#if book.name?? >
</#if> b: <#case refValue1> ... <#break> <#case refValue2> ... <#break> ... <#case refValueN> ... <#break> <#default> ... </#switch>
3.循环读取 <#list sequence as item> ... </#list> 空值判断<#if bookList?size = 0></#list> e.g. <#list employees as e> </#list> 1. Readonly
4.FreeMarker 3宏/模板 宏是在模板中使用macro指令定义 l.1基本用法 宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子: <#macro greet> <font size="+2">Hello Joe!</font> </#macro> 调用宏时,与使用FreeMarker的其他指令类似,只是使用@替代FTL标记中的#。 <@greet></@greet> <#--<@greet/>--> 在macro指令中可以在宏变量之后定义参数,如: <#macro greet person> <font size="+2">Hello ${person}!</font> </#macro> 可以这样使用这个宏变量: <@greet person="Fred"/> 但是下面的代码具有不同的意思: <@greet person=Fred/> 这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式。 宏可以有多参数,下面是一个例子: <#macro greet person color> <font size="+2" color="${color}">Hello ${person}!</font> </#macro> 可以这样使用该宏变量,其中参数的次序是无关的: <@greet person="Fred" color="black"/> 可以在定义参数时指定缺省值,否则,在调用宏的时候,必须对所有参数赋值: <#macro greet person color="black"> <font size="+2" color="${color}">Hello ${person}!</font> </#macro> 注意:宏的参数是局部变量,只能在宏定义中有效。 嵌套内容 FreeMarker的宏可以有嵌套内容,<#nested>指令会执行宏调用指令开始和结束标记之间的模板片断,举一个简单的例子: <#macro border> <table border=4 cellspacing=0 cellpadding=4><tr><td> <#nested> </tr></td></table> </#macro> 执行宏调用: <@border>The bordered text</@border> 输出结果: <table border=4 cellspacing=0 cellpadding=4><tr><td> The bordered text </tr></td></table> <#nested>指令可以被多次调用,每次都会执行相同的内容。 <#macro do_thrice> <#nested> <#nested> <#nested> </#macro> <@do_thrice> Anything. </@do_thrice> FMPP输出结果: Anything. Anything. Anything. 嵌套内容可以是有效的FTL,下面是一个有些复杂的例子,我们将上面三个宏组合起来: <@border> <ul> <@do_thrice> <li><@greet person="Joe"/> </@do_thrice> </ul> </@border> 输出结果: <table border=4 cellspacing=0 cellpadding=4><tr><td> <ul> <li><font size="+2">Hello Joe!</font> <li><font size="+2">Hello Joe!</font> <li><font size="+2">Hello Joe!</font> </ul> </tr></td></table> 宏定义中的局部变量对嵌套内容是不可见的,例如: <#macro repeat count> <#local y = "test"> <#list 1..count as x> ${y} ${count}/${x}: <#nested> </#list> </#macro> <@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat> 输出结果: test 3/1: ? ? ? test 3/2: ? ? ? test 3/3: ? ? ? 在宏定义中使用循环变量 nestted指令也可以有循环变量(循环变量的含义见下节),调用宏的时候在宏指令的参数后面依次列出循环变量的名字,格式如下: <@ macro_nam |
<script type="text/javascript"> </script>