`
yuexj
  • 浏览: 8771 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

freemaker学习笔记--设计指导

阅读更多

 <# ... > 中存放所有freemaker的内容,之外的内容全部原样输出。
<@ ... /> 是函数调用
两个定界符内的内容中,第一个符号表示指令或者函数名,其后的跟随参数。freemaker提供的控制包括如下:
<#if condition><#elseif condition><#else></#if> 条件判断
<#list hash_or_seq as var></#list> 遍历hash表或者collection(freemaker称作sequence)的成员
<#macro name param1 param2 ... ><#nested param></#macro> 宏,无返回参数
<#function name param1 param2><#return val></#function>函数,有返回参数
var?member_function(...) 用函数对var进行转换,freemaker称为build-ins。实际内部实现类似member_function(var, ...)
stringA[M .. N] 取子字符串,类似substring(stringA, M, N)
{key:value, key2:value2 ...} 直接定义一个hash表
[item0, item1, item2 ...] 直接定义一个序列
hash0[key0] 存取hash表中key对应的元素
seq0[5] 存取序列指定下标的元素
<@function1 param0 param1 ... /> 调用函数function1
<@macro0 param0 param1 ; nest_param0 nest_param1 ...> nest_body <
 /@macro > 调用宏,并处理宏的嵌套
<#assign var = value > 定义变量并初始化
<#local var = value> 在 macro 或者 function 中定义局部变量并初始化
<#global var = value > 定义全局变量并初始化
${var} 输出并替换为表达式的值
<#visit xmlnode> 调用macro匹配xmlnode本身及其子节点
<#recurse xmlnode> 调用macro匹配xmlnode的子节点
 


<#if condition > </#if> 
<#list SequenceVar as variable > repeatThis </#list>
<#include "/copyright_footer.html">

一个ftl标记不能放在另外一个ftl标记里面,但是注释标记能够放在ftl标记里面。

系统预定义指令采用<#...></#>
用户自定义指令采用<@...></@>

hash片段可以采用:
 products[10..19] or products[5..] 的格式。

序列也可以做加法计算:passwords + {"joe":"secret42"}

缺省值: name!"unknown" 或者 (user.name)!"unknown" 或者 name! 或者 (user.name)!

null值检查: name?? or (user.name)??

转义列表:

Escape sequence

Meaning

\"(文章来源 www.iocblog.net)

Quotation mark (u0022)

\'

Apostrophe (a.k.a. apostrophe-quote) (u0027)

\\

Back slash (u005C)

\n

Line feed (u000A)

\r

Carriage return (u000D)

\t

Horizontal tabulation (a.k.a. tab) (u0009)

\b

Backspace (u0008)

\f

Form feed (u000C)

\l

Less-than sign: <

\g

Greater-than sign: >

\a

Ampersand: &

\{

Curly bracket: {

\xCode

Character given with its hexadecimal Unicode code (UCS code)


如果想打印${,则需要将{转义,可以写成"$\{user}",或者可以用生字符(r指令):$(r "${xx}"}

序列构成:<#list 
["winter", "spring", "summer", "autumn"] as x>${x}</#list>

不同的对象可以存放在一个序列里面,比如:
[2 + 2, [1, 2, 3, 4], "whatnot"]. 第一个是数字,第二个是序列,第三个是字符串。

可用采用start..end的方式来定义一个数字序列,start可以小于end,同时,end也可以省略。

hash取值支持一下四种模式:
book.author.namebook["author"].namebook.author.["name"],book["author"]["name"].

特殊变量是指freemaker引擎本身定义的变量。访问时,以.variable_name的语法访问。

变量表达式支持嵌套模式,比如:${"Hello ${user}!"}。

变量表达式在指令中的使用情况:
变量表达式可以在指令中,用“”的方式存在,不如:
<#include "/footer/${company}.html">
但是不允许下面的方式存在: 
<#if ${isBig}>Wow!</#if>, 正确写法是:<#if isBig>Wow!</#if>
而且 
<#if "${isBig}">Wow!</#if>写法也不正确,因为"${isBig}"返回的是字符串,不是boolean类型。

字符串中取字符或字符串采用以下语法:${user[0]},${user[0..2]} ${user[4..]},${user?string(4)}

序列操作:
   加法:<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user> 但要注意串联之后的读取速度变慢。
   子序列:
seq[1..4]

序列和hash的串联都只能用于两个相加,不能有多个相加的模式,hash相加,如果两个相加的hash存在相同的key,则后面会覆盖前面的。

在使用>=或者>时,需要注意一些问题,因为freemaker会将>解释成标记的关闭符,为了解决这个问题,需要在表达式加上括号,比如: 
<#if (x > y)>. 或者使用 &gt; and &lt符号来代替。

无值变量(包括无该变量,null,返回void,无属性等):
unsafe_expr!default_expr or unsafe_expr! or(unsafe_expr)!default_expr or (unsafe_expr)!
缺省值可以是任何类型,不一定是数字,比如:hits!0 或者 colors!["red", "green", "blue"]

如果缺省值忽略,那么将会默认为空串、空序列或者空hash,因为freemarker支持多类型的值。不过要让默认值为0或false,则不能省略缺省值。

非顶层变量的无值处理:
   product.color! "red":只处理product不为空,color为空的缺省值处理,如果product为空,则freemaker会抛出异常。 (product.color)!"red":则会处理product为空,color为空,或者没有color属性的无值情况。

无值变量的判断操作:
unsafe_expr?? or (unsafe_expr)??

判断变量是否是无值。

普通变量插入方式: 
${expression},${3+5);
数字变量插入方式: #{expression} or #{expressionformat}:过期。
变量只能用于文本区或者是字符串里面,比如:<h1>Hello ${name}!</h1>
以及 <#include "/footer/${company}.html">

数字值的插入:根据缺省的number_format输出,以及可以通过setting来达到设置数字格式的目的,也可以通过内置函数string来改变输出格式。

日期类型的格式设置:date_format
time_format 和 datetime_format


定义宏:
   不带参数:
<#macro 宏名>...</#macro>,引用<@宏名 />
   带参数:<#macro 宏名 参数...>...</#macro>,引用<@宏名 参数1=值1.../>,带有参数的宏,调用是参数的值必须和参数的个数相同。当然也可以在宏定义时给参数一些默认值。比如:<#macro greet person color="black">


宏里面的嵌套内容:
<
#macro border>
  <table border=4 cellspacing=0 cellpadding=4><tr><td>(文章来源 www.iocblog.net)
    
<#nested>
  </tr></td></table>
</#macro> 
在宏的定义body中加入<#nested>指令。嵌套的内容可以是任何正确的ftl块。

宏的本地变量在嵌套内容中是不可见的。

宏定义时,<#nest>指令相当于调用定义的内容,而使用宏时,nest body相当于定义。
<#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> 


定义变量:
   在模板中定义的变量将会隐藏(不是更改)数据模型根下面的同名的变量。

模板中的3种类型变量:
   1:
plain variables,能够在模板中的任何地方访问,一个模板include另外一个模板,也可以访问被包含模板的变量。可以通过assign或者macro指令产生或替换变量。
   如果要访问数据模型中的变量,则可以通过.global来访问:
   <#assign user = "Joe Hider">
   ${user}          <#-- prints: Joe Hider -->
   ${.globals.user} <#-- prints: Big Joe--> 
   2:
Local variables,宏定义body中用local指令创建或者替换。
   3:Loop variables:由list指令产生。


namespaces:
<#import "/lib/my_test.ftl" as 
my> <#-- the hash called "my" will be the "gate" -->
<@
my.copyright date="1999-2002"/>
${
my.mail} 

设置命名空间里面的变量:<#assign mail="jsmith@other.com" 
in my>

命名空间与数据模型:命名空间的ftl可以访问数据模型的变量。同样命名空间的变量也会隐藏数据模型中同名的变量。

空白问题:
1:White-space stripping,默认为enabled,清除ftl标记带来的空白以及缩进。处理模板的空白。
2:t, 
rtlt指令。
3:ftl的参数strip_text.

用compress directive或者transform来处理输出。
<#compress>
...</#compress>:消除空白行。
<@compress single_line=true>
.../@compress将输出压缩为一行。

可替换语法:
freemarker可用"["代替"<".在模板的文件开头加上
[#ftl].

分享到:
评论

相关推荐

    freemarker学习资料汇总

    本压缩包集合了丰富的Freemarker学习资源,涵盖从基础到进阶的各种知识点,以下是这些文档中可能包含的详细内容: 1. **Freemarker中文手册.pdf**: 这份手册通常会详细介绍Freemarker的基本概念,如模板语言、...

    JEECMS自学帮助集合(包括FreeMarker)

    10. **jeecms学习笔记**:jeecms学习笔记.txt可能是某位开发者的学习心得,可能包含了一些实战经验和技巧。 通过这些资源,你可以系统地学习JEECMS的各个方面,从基础操作到高级开发,再到FreeMarker的运用,都能...

    freemarker_jar包及文档

    1. **Freemaker_入门+深入+开发指南+学习笔记.doc**:这份文档通常包含了Freemarker的基础概念、快速入门教程、进阶技巧以及开发实践指导。通过阅读,我们可以了解到如何创建模板、变量的使用、控制结构(如if/else...

    HelloSpring:Spring学习笔记-2020年8月6日10点10分

    6. **渲染视图**:视图负责将数据呈现给用户,可以是JSP、FreeMarker或其他模板引擎。 【Spring Boot简介】 Spring Boot是为了简化Spring应用程序的初始搭建以及开发过程而设计的。它默认配置了很多常见的功能,...

    Spring3.0学习笔记

    尚学堂的Spring学习笔记.doc可能包含对这些特性的详细解释、实例代码以及如何在实际项目中应用的指导,对于想要深入理解Spring 3.0的开发者来说是一份宝贵的参考资料。通过阅读这份笔记,你可以系统地学习Spring 3.0...

    springmvc学习笔记.zip

    这个“springmvc学习笔记.zip”文件很可能包含了关于如何理解和使用SpringMVC的详细教程或个人学习记录。以下是一些核心知识点的详细说明: 1. **MVC架构**:MVC是一种设计模式,将应用程序分为三个主要组件:模型...

    struts2综合笔记

    - 配置文件用于指导控制器如何运作,通常涉及路径映射、拦截器配置、结果类型定义等。 **动作类**: - 动作类负责处理具体的业务逻辑,通常是 POJO 类,其中包含了一个或多个方法来响应不同的用户操作。 **JSP**: -...

    appfuse 学习笔记

    AppFuse 是一个开源项目,旨在加速和简化J2EE应用程序的开发流程。由Matt Raible设计,它作为一...通过深入阅读和实践AppFuse的学习笔记,开发者可以逐步掌握其核心功能,并将其应用到实际项目中,提升开发质量和效率。

    struts2笔记.doc

    - **freemarker-2.3.13.jar**:用于页面渲染的模板引擎,Struts2的UI标签基于Freemarker实现。 - **commons-logging-1.0.4.jar**:日志处理包,用于记录应用运行时的信息。 - **ognl-2.6.11.jar**:对象图导航语言,...

    freemaker全部资料

    这份"freemaker全部资料"压缩包包含了一系列与Freemarker相关的资源,包括核心库的jar包、Eclipse插件及其安装指南、学习笔记以及一个SpringMVC集成Freemarker的实际示例。 首先,让我们深入理解Freemarker模板引擎...

    struts2笔记

    Struts2 是一款流行的Java开源框架,它基于Model-View-Controller (MVC)设计模式,专注于请求分发和控制层的功能,有助于...对于初学者来说,学习Struts2的笔记可以帮助快速理解和掌握这个框架的基本概念和使用方法。

    [黑马程序员Struts2 2016版视频] 前3Days笔记

    本笔记主要涵盖的是黑马程序员2016年推出的Struts2教程的前3天内容,虽然没有提供源代码,但依然能为我们提供丰富的理论知识和实践指导。 一、Struts2框架概述 Struts2是Apache软件基金会的开源项目,它是Struts1的...

    spring5mvc第三天【大纲笔记】.zip

    综上所述,《Spring MVC 第三天【大纲笔记】》详细讲解了SSM整合的关键步骤和核心概念,对于理解和掌握Spring MVC在企业级应用开发中的实践具有重要指导意义。通过学习,开发者能够熟练地构建和管理SSM整合的Web项目...

    struts 教学

    在"struts教学笔记.txt"中,可能包含了关于这些概念的详细解释、示例代码和实践指导。学习Struts不仅有助于理解MVC模式,还能提升Java Web开发的效率,因为它的组件化和模块化设计使得代码更加可维护和扩展。 总结...

Global site tag (gtag.js) - Google Analytics