- 浏览: 141517 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
puyancheng1988:
哥们儿,我用的jfreechart在linux服务器上生成的图 ...
JFreeChart图表 -
soujava:
...
Linux下Oracle自动备份脚本 -
skylikeblue:
...
基于JAVA实现的手机收发短消息系统
(1)模板 + 数据模型 = 输出FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念他们是分工劳动的: 设计者专注于表示——创建HTML文件、图片、Web页面的其它可视化方面; 程序员创建系统,生成设计页面要显示的数据。 经常会遇到的问题是:在Web页面(或其它类型的文档)中显示的信息在设计页面时是无效的,是基于动态数据的。在这里,你可以在HTML(或其它要输出的文本)中加入一些特定指令,FreeMarker会在输出页面给最终用户时,用适当的数据替代这些代码。 下面是一个例子: <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的指令,而包含FreeMarker的指令的文件就称为模板(Template)。 至于user、latestProduct.url和latestProduct.name来自于数据模型(data model)。 数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成。 模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型。 下面是一个可能的数据模型: (root) | +- user = "Big Joe" | +- latestProduct | +- url = "products/greenmouse.html" | +- name = "green mouse"数据模型类似于计算机的文件系统,latestProduct可以看作是目录。 2、数据模型(1)基础在快速入门中介绍了在模板中使用的三种基本对象类型:scalars、hashes 和sequences,其实还可以有其它更多的能力:
通常每个变量只具有上述的一种能力,但一个变量可以具有多个上述能力,如下面的例子: (root) | +- mouse = "Yerri" | +- age = 12 | +- color = "brown">mouse既是scalars又是hashes,将上面的数据模型合并到下面的模板: ${mouse} <#-- use mouse as scalar --> ${mouse.age} <#-- use mouse as hash --> ${mouse.color} <#-- use mouse as hash -->输出结果是: Yerri 12 brown (2)Scalar变量Scalar变量存储单值,可以是:
(3)hashes 、sequences和集合有些变量不包含任何可显示的内容,而是作为容器包含其它变量,者有两种类型:
集合变量通常类似sequences,除非无法访问它的大小和不能使用索引来获得它的子变量;集合可以看作只能由<#list …>指令使用的受限sequences (4)方法方法变量通常是基于给出的参数计算值。 下面的例子假设程序员已经将方法变量avg放到数据模型中,用来计算数字平均值: The average of 3 and 5 is: ${avg(3, 5)} The average of 6 and 10 and 20 is: ${avg(6, 10, 20)} The average of the price of python and elephant is: ${avg(animals.python.price, animals.elephant.price)} (5)宏和变换器宏和变换器变量是用户自定义指令(自定义FTL标记),会在后面讲述这些高级特性 (6)节点节点变量表示为树型结构中的一个节点,通常在XML处理中使用,会在后面的专门章节中讲 3、模板(1)整体结构模板使用FTL(FreeMarker模板语言)编写,是下面各部分的一个组合:
下面是以一个具体模板例子: <html> <head> <title>Welcome!</title> </head> <body> <#-- Greet the user with his/her name --> <h1>Welcome ${user}!</h1> <p>We have these animals: <ul> <#list animals as being> <li>${being.name} for ${being.price} Euros </#list> </ul> </body> </html> 注意事项:
<#if <#include 'foo'>='bar'>...</if>
<h1>Welcome ${user <#-- The name of user -->}!</h1> <p>We have these animals: <ul> <#list <#-- some comment... --> animals as <#-- again... --> being> ...
(2)指令在FreeMarker中,使用FTL标记引用指令。有三种FTL标记,这和HTML标记是类似的:
有两种类型的指令:预定义指令和用户定义指令。 用户定义指令要使用@替换#,如<@mydirective>...</@mydirective>(会在后面讲述)。 FTL标记不能够交叉,而应该正确的嵌套,如下面的代码是错误的: <ul> <#list animals as being> <li>${being.name} for ${being.price} Euros <#if use = "Big Joe"> (except for you) </#list> </#if> <#-- WRONG! --> </ul>如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息。 FreeMarker会忽略FTL标记中的空白字符,如下面的例子: <#list animals as being > ${being.name} for ${being.price} Euros </#list >但是,<、</和指令之间不允许有空白字符。 (3)表达式直接指定值
如果包含特殊字符需要转义,如下面的例子: ${"It's \"quoted\" and this is a backslash: \\"} ${'It\'s "quoted" and this is a backslash: \\'}输出结果是: It's "quoted" and this is a backslash: \ It's "quoted" and this is a backslash: \下面是支持的转义序列:
有一类特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子: ${r"${foo}"} ${r"C:\foo\bar"}输出的结果是: ${foo} C:\foo\bar
直接输入,不需要引号 精度数字使用“.”分隔,不能使用分组符号 目前版本不支持科学计数法,所以“1E3”是错误的 不能省略小数点前面的0,所以“.5”是错误的 数字8、+8、08和8.00都是相同的
true和false,不使用引号
由逗号分隔的子变量列表,由方括号限定,下面是一个例子: <#list ["winter", "spring", "summer", "autumn"] as x> ${x} </#list>输出的结果是: winter spring summer autumn列表的项目是表达式,所以可以有下面的例子: [2 + 2, [1, 2, 3, 4], "whatnot"]可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意数字范围没有方括号 可以定义反递增的数字范围,如5..2
{"name":"green mouse", "price":150}键和值都是表达式,但是键必须是字符串 获取变量
可以使用点语法或方括号语法,假设有下面的数据模型: (root) | +- book | | | +- title = "Breeding green mouses" | | | +- author | | | +- name = "Julia Smith" | | | +- info = "Biologist, 1923-1985, Canada" | +- test = "title"下面都是等价的: book.author.name book["author"].name book.author.["name"] book["author"]["name"]使用点语法,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字是任意表达式的结果
序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式
字符串操作
可以使用${..}(或#{..})在文本部分插入表达式的值,例如: ${"Hello ${user}!"} ${"${user}${user}${user}${user}"}可以使用+操作符获得同样的结果 ${"Hello " + user + "!"} ${user + user + user + user}${..}只能用于文本部分,下面的代码是错误的: <#if ${isBig}>Wow!</#if> <#if "${isBig}">Wow!</#if>应该写成: <#if isBig>Wow!</#if>
例子(假设user的值为“Big Joe”): ${user[0]}${user[4]} ${user[1..4]}结果是(注意第一个字符的索引是0): BJ ig J序列操作
<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user> - ${user} </#list>输出结果是: - Joe - Fred - Julia - Kate散列操作
<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}> - Joe is ${ages.Joe} - Fred is ${ages.Fred} - Julia is ${ages.Julia}输出结果是: - Joe is 30 - Fred is 25 - Julia is 18算术运算
${x * x - 100} ${x / 2} ${12 % 10}输出结果是(假设x为5): -75 2.5 2操作符两边必须是数字,因此下面的代码是错误的: ${3 * "5"} <#-- WRONG! -->使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如: ${3 + "5"}输出结果是: 35使用内建的int(后面讲述)获得整数部分,例如: ${(x/2)?int} ${1.1?int} ${1.999?int} ${-1.1?int} ${-1.999?int}输出结果是(假设x为5): 2 1 1 -1 -1
使用=(或==,完全相等)测试两个值是否相等,使用!= 测试两个值是否不相等 =和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误 Freemarker是精确比较,所以对"x"、"x "和"X"是不相等的 对数字和日期可以使用<、<=、>和>=,但不能用于字符串 由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x > y)> 另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=
&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误 例子: <#if x < 12 && color = "green"> We have less than 12 things, and they are green. </#if> <#if !hot> <#-- here hot must be a boolean --> It's not hot. </#if>
内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出常用的一些函数
html:对字符串进行HTML编码 cap_first:使字符串第一个字母大写 lower_case:将字符串转换成小写 upper_case:将字符串转换成大写 trim:去掉字符串前后的空白字符
size:获得序列中元素的数目
int:取得数字的整数部分(如-1.9?int的结果是-1) 例子(假设test保存字符串"Tom & Jerry"): ${test?html} ${test?upper_case?html}输出结果是: Tom & Jerry TOM & JERRY
(4)InterpolationInterpolation有两种类型:
注意:Interpolation只能用于文本部分
插入字符串值:直接输出表达式结果 插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子: <#setting number_format="currency"/> <#assign answer=42/> ${answer} ${answer?string} <#-- the same as ${answer} --> ${answer?string.number} ${answer?string.currency} ${answer?string.percent}输出结果是: $42.00 $42.00 42 $42.00 4,200%插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个使用格式模式的例子: ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdated?string("EEE, MMM d, ''yy")} ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")}输出的结果类似下面的格式: 2003-04-08 21:24:44 Pacific Daylight Time Tue, Apr 8, '03 Tuesday, April 08, 2003, 09:24:44 PM (PDT)插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子: <#assign foo=true/> ${foo?string("yes", "no")}输出结果是: yes
mX:小数部分最小X位 MX:小数部分最大X位 例子: <#-- If the language is US English the output is: --> <#assign x=2.582/> <#assign y=4/> #{x; M2} <#-- 2.58 --> #{y; M2} <#-- 4 --> #{x; m1} <#-- 2.6 --> #{y; m1} <#-- 4.0 --> #{x; m1M2} <#-- 2.58 --> #{y; m1M2} <#-- 4.0 --> 4、杂项(1)用户定义指令宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏
宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子: <#macro greet> <font size="+2">Hello Joe!</font> </#macro>作为用户定义指令使用宏变量时,使用@替代FTL标记中的# <@greet></@greet>如果没有体内容,也可以使用: <@greet/>
在macro指令中可以在宏变量之后定义参数,如: <#macro greet person> <font size="+2">Hello ${person}!</font> </#macro>可以这样使用这个宏变量: <@greet person="Fred"/> and <@greet person="Batman"/>输出结果是: <font size="+2">Hello Fred!</font> and <font size="+2">Hello Batman!</font> 宏的参数是FTL表达式,所以下面的代码具有不同的意思: <@greet person=Fred/>这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式 可以有多参数,下面是一个例子: <#macro greet person color> <font size="+2" color="${color}">Hello ${person}!</font> </#macro>可以这样使用该宏变量: <@greet person="Fred" color="black"/>其中参数的次序是无关的,因此下面是等价的: <@greet color="black" person="Fred"/>只能使用在macro指令中定义的参数,并且对所有参数赋值,所以下面的代码是错误的: <@greet person="Fred" color="black" background="green"/> <@greet person="Fred"/>可以在定义参数时指定缺省值,如: <#macro greet person color="black"> <font size="+2" color="${color}">Hello ${person}!</font> </#macro>这样<@greet person="Fred"/>就正确了 宏的参数是局部变量,只能在宏定义中有效
用户定义指令可以有嵌套内容,使用<#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>输出结果: 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: ? ? ?
用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字 例子: <#macro repeat count> <#list 1..count as x> <#nested x, x/2, x==count> </#list> </#macro> <@repeat count=4 ; c, halfc, last> ${c}. ${halfc}<#if last> Last!</#if> </@repeat>输出结果: 1. 0.5 2. 1 3. 1.5 4. 2 Last! 指定的循环变量的数目和用户定义指令开始标记指定的不同不会有问题 调用时少指定循环变量,则多指定的值不可见 调用时多指定循环变量,多余的循环变量不会被创建 (2)在模板中定义变量在模板中定义的变量有三种类型:
宏的参数是局部变量,而不是循环变量;局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子: <#assign x = "plain"> 1. ${x} <#-- we see the plain var. here --> <@test/> 6. ${x} <#-- the value of plain var. was not changed --> <#list ["loop"] as x> 7. ${x} <#-- now the loop var. hides the plain var. --> <#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here --> 8. ${x} <#-- it still hides the plain var. --> </#list> 9. ${x} <#-- the new value of plain var. --> <#macro test> 2. ${x} <#-- we still see the plain var. here --> <#local x = "local"> 3. ${x} <#-- now the local var. hides it --> <#list ["loop"] as x> 4. ${x} <#-- now the loop var. hides the local var. --> </#list> 5. ${x} <#-- now we see the local var. again --> </#macro>输出结果: 1. plain 2. plain 3. local 4. loop 5. local 6. plain 7. loop 8. loop 9. plain2 内部循环变量隐藏同名的外部循环变量,如: <#list ["loop 1"] as x> ${x} <#list ["loop 2"] as x> ${x} <#list ["loop 3"] as x> ${x} </#list> ${x} </#list> ${x} </#list>输出结果: loop 1 loop 2 loop 3 loop 2 loop 1模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是Big Joe: <#assign user = "Joe Hider"> ${user} <#-- prints: Joe Hider --> ${.globals.user} <#-- prints: Big Joe --> (3)名字空间通常情况,只使用一个名字空间,称为主名字空间 为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,其目的是防止同名冲突
下面是一个创建库的例子(假设保存在lib/my_test.ftl中): <#macro copyright date> <p>Copyright (C) ${date} Julia Smith. All rights reserved. <br>Email: ${mail}</p> </#macro> <#assign mail = "jsmith@acme.com">使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量: <#import "/lib/my_test.ftl" as my> <#assign mail="fred@acme.com"> <@my.copyright date="1999-2002"/> ${my.mail} ${mail}输出结果: <p>Copyright (C) 1999-2002 Julia Smith. All rights reserved. <br>Email: jsmith@acme.com</p> jsmith@acme.com fred@acme.com可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间 可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子: <#import "/lib/my_test.ftl" as my> ${my.mail} <#assign mail="jsmith@other.com" in my> ${my.mail}输出结果: jsmith@acme.com jsmith@other.com数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库: <#macro copyright date> <p>Copyright (C) ${date} ${user}. All rights reserved.</p> </#macro> <#assign mail = "${user}@acme.com">假设数据模型中的user变量的值是Fred,则下面的代码: <#import "/lib/my_test.ftl" as my> <@my.copyright date="1999-2002"/> ${my.mail}输出结果: <p>Copyright (C) 1999-2002 Fred. All rights reserved.</p> Fred@acme.com |
发表评论
-
Cannot access NLS data files问题的解决办法
2008-10-24 15:14 1442我用的myeclipse 6.5版本,oracle是10g版 ... -
Java Web定时任务
2008-10-28 10:04 549在工程的WEB-INF\web.xml配置文件中加入如下三行, ... -
BeanUtil常用方法
2008-10-31 14:25 909Apache Common BeanUtil是一个常用的在对 ... -
安装Visual Editor
2008-11-03 17:05 1257在Eclipse 3.3.2中安装Visual Editor ... -
BeanUtils.copyProperties出现了问题的原因
2008-11-11 15:16 1131使用BeanUtils.copyProperties( des ... -
Servlet/Jsp性能优化
2008-03-05 16:21 719你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访 ... -
系统构建高性能J2EE应用的五种核心策略
2008-03-05 16:26 628于J2EE,我们知道当开发 ... -
JFreeChart图表
2008-03-05 16:30 1609在我们编程时如果要把结果显示成图表形式,就离不开JFreeCh ... -
使用JFreeChart 在网站中使用走势图
2008-03-05 16:35 993生活中我们经常用到各种图表,走势图就是其中的一种,例如:股票走 ... -
JFreeChart综合应用
2008-03-05 16:40 747JFreeChart是一个开源的JAVA项目,它主要用来开发各 ... -
要成为Java高手需要注意的25个学习目标
2008-04-05 14:16 5511、你需要精通面向对象 ... -
使用Axis开发Web Service实例
2008-06-03 15:40 849一、Axis安装 1、环境 J2SE SDK 1.3 or 1 ... -
Java实现HTTP的断点续传
2008-06-05 10:39 634(一)断点续传的原理 其实断点续传的原理很简单,就是在Ht ... -
java串口编程
2008-06-05 11:00 1214一年半前在jbuilder2006下写过串口通信程序,最近做一 ... -
Java串行端口技术协议
2008-06-05 11:06 791串行通讯协议有很 ... -
基于JAVA实现的手机收发短消息系统
2008-06-05 11:14 15010 引 言 目前基于GSM网络的短消息应用越来越多。由于采用短 ... -
多国语表单提交乱码问题
2008-06-30 10:43 7941、所有文件都以-utf-8编码格式保存 2、所有文件都设置 ... -
网站跨站点单点登录
2008-07-03 13:20 1093昨天和几位朋友探讨到 ... -
FreeMarker概述
2008-07-03 14:43 749快速入门 (1)模板 + ... -
使用FreeMarker生成Html静态文件(实例)
2008-07-04 10:31 761以下是我在生成新闻的静态文件时用到的代码.仅供参考.请根据实际 ...
相关推荐
FreeMarker 学习手册 详细介绍FreeMarker模板技术的手册
通过这份"freemarker中文手册",读者可以系统地学习Freemarker的各个方面,包括基本语法、进阶特性以及在实际项目中的应用技巧。文档中的示例部分尤其重要,因为实践是理解和掌握任何技术的关键。在阅读和学习的过程...
在学习FreeMarker的过程中,你可能会接触到以下关键知识点: - **变量表达式(Variable Expression)**:如`${variable}`,用于在模板中插入数据模型中的变量值。 - **指令(Directives)**:如`<#if>`、`...
Freemarker是一个强大的模板引擎,常用于...通过学习这个中文手册,开发者可以更好地掌握其核心概念,从而在实际项目中有效利用它来构建高效、易维护的视图层。同时,了解源码可以帮助解决更复杂的问题,提升开发效率。
Freemarker是一个强大的模板引擎,主要...通过深入学习和熟练运用Freemarker,开发者可以构建出高效、灵活且易于维护的Web应用视图层。在实际项目中,结合WebWork或其他MVC框架,可以充分发挥其优势,提升开发效率。
通过阅读《freemarker操作手册》提供的完整教程,你可以系统地学习到以上所有内容,并结合实践,熟练掌握Freemarker的使用技巧。无论是初学者还是经验丰富的开发者,这份手册都是深入理解和应用Freemarker不可或缺的...
通过手册的学习,开发者可以掌握如何创建配置实例、定义数据模型、获取模板、合并模板和数据模型,以及将所有这些部分集成在一起形成最终输出。 手册还涉及到FreeMarker程序开发指南,这部分内容涵盖了如何在实际...
通过阅读《freemarker 中文手册》(doc),你可以深入理解上述概念,并学习如何在实际项目中有效地使用Freemarker。手册会详细介绍每个功能的用法,包括示例和注意事项,是学习和查阅Freemarker的宝贵资源。
这个"freemarker 中文手册 jar包"包含了官方的中文文档和对应的Apache Freemarker库,版本为2.3.23,同时提及了2.3.28版本的jar。这份资源对于学习和理解Freemarker的用法非常有帮助,特别是对于中文使用者,避免了...
《FreeMarker中文参考手册》是学习和理解FreeMarker的关键资源,尤其对于非英语为母语的开发者来说,中文版手册极大地降低了学习门槛。手册详细介绍了FreeMarker的语法、指令、宏、内置对象和变量等核心概念,涵盖了...
FreeMarker的官方文档和这两份手册是学习FreeMarker的基础。此外,网上有许多教程、博客和论坛讨论,可以辅助理解FreeMarker的实际应用场景和解决常见问题。 总结,FreeMarker是一个强大的模板引擎,它简化了Web...
综上,这份Freemarker中文手册涵盖了Freemarker的基本概念、语法、内置函数、与Java的交互方式以及高级特性和最佳实践,是学习和使用Freemarker不可或缺的参考资料。通过深入阅读和实践,开发者能够熟练地运用...
Freemarker是一个强大的模板引擎,常用于Java...总结来说,"非常详尽的Freemarker参考手册"是学习和提高Freemarker技能的宝贵资料,其HTML版本的便捷导航功能更是提升了查阅效率,值得每个Freemarker使用者收藏和参考。
它被广泛应用于Java web开发中,与Spring、Struts等框架配合使用,为视图层提供便利。...现在,你可以打开提供的"FreeMarker.doc"文档,进一步了解详细信息和示例代码,开始你的FreeMarker学习之旅。祝你学习顺利!
这个“freemarker 中文手册”可能是对Freemarker模板语言的详细解释和使用指南,方便中文用户理解和学习。 Freemarker的设计理念是分离业务逻辑和表现逻辑,让开发者专注于数据处理,而模板设计者则关注页面布局和...
尚学堂提供的这本“Freemarker使用手册”是学习和理解这个模板语言的重要参考资料。以下将详细介绍Freemarker的核心概念、语法以及在实际开发中的应用。 1. **核心概念** - **模板(Templates)**:Freemarker模板是...
通过这个中文手册,开发者不仅可以学习到Freemarker的基础用法,还能深入理解其高级特性,从而在实际项目中更高效地利用Freemarker实现动态网页的生成。无论是初学者还是经验丰富的开发者,都能从中受益。
Freemarker是一个强大的模板引擎,常用于Java应用中生成动态HTML、XML或其他格式的文本。它采用简单的标记语言,让...学习和掌握这些知识,将有助于在实际开发中灵活运用Freemarker,实现高效且易于维护的模板逻辑。
本压缩包集合了丰富的Freemarker学习资源,涵盖从基础到进阶的各种知识点,以下是这些文档中可能包含的详细内容: 1. **Freemarker中文手册.pdf**: 这份手册通常会详细介绍Freemarker的基本概念,如模板语言、...
这个2.3.18版本的中文手册是开发者学习和使用Freemarker的重要参考资料。 在Freemarker 2.3.18版本中,有几个关键知识点值得一提: 1. **模板语言基础**:Freemarker模板由静态文本和动态控制结构组成,如`<#if>`...