`
jiasudu1649
  • 浏览: 710592 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

freemarker常用语法

阅读更多

 

 

freemarker常用语法

<!-- / icon and title --><!-- message -->
常用语法
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% -->
插入布尔值:
<#assign foo=ture />
${foo?string("yes","no")} <#-- yes -->




2.逻辑判断
a:
<#if condition>...
<#elseif condition2>...
<#elseif condition3>......
<#else>...
其中空值判断可以写成<#if book.name?? >

</#if>

b:
<#switch value>
<#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>
${e_index}. ${e.name}
</#list>
输出:
1. Readonly
2. Robbin

4.FreeMarker

3 宏/模板
宏Macro
宏是在模板中使用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_name paramter list; loop variable list[,]>
例如:
<#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>
这里count是宏的参数,c, halfc,last则为循环变量,输出结果:
1. 0.5
2. 1
3. 1.5
4. 2 Last!
循环变量和宏标记指定的不同不会有问题,如果调用时少指定了循环变量,那么多余的值不可见。调用时多指定了循环变量,多余的循环变量
不会被创建:
<@repeat count=4 ; c, halfc, last>
${c}. ${halfc}<#if last> Last!</#if>
</@repeat>
<@repeat count=4 ; c, halfc>
${c}. ${halfc}
</@repeat>
<@repeat count=4>
Just repeat it...
</@repeat>
在模板中定义变量
在模板中定义的变量有三种类型:
plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。
局部变量:在宏定义体中有效,使用local指令创建和替换。
循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量
局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子:
<#assign x = "plain">

${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 -->
名字空间
通常情况,只使用一个名字空间,称为主名字空间,但为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,
其目的是防止同名冲突
创建库
下面是一个创建库的例子(假设保存在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


四.Freemarker与Struts结合
1.输出文件换成以ftl格式的文件
E.G.
<action name="bookActionForm" parameter="method" path="/bookAction" scope="request" type="example.BookAction"
validate="true">
<forward name="list" path="/index.ftl"/>
</action>
2.使用struts,jstl等标签
a.导入à<#global html=JspTaglibs["/WEB-INF/tags/struts-html.tld"]>
或<#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]>
<#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]>
<#assign logic=JspTaglibs["/WEB-INF/struts-logic.tld"]>
b.使用à<@bean.page id="request" property="request"/>,
<@html.text property="vo.newsTitle" styleClass="input1"/>
五.用Freemarker生成Html页面
例子:MakeFileManager.java


package example;
             import freemarker.template.Configuration;
            import java.text.SimpleDateFormat;
            import java.io.File;
            import freemarker.template.DefaultObjectWrapper;
            import java.util.Map;
            import java.util.HashMap;
            import java.io.Writer;
            import java.io.OutputStreamWriter;
            import java.io.FileOutputStream;
            import freemarker.template.TemplateException;
            import java.io.IOException;
            import freemarker.template.Template;
             public class MakeFileManager {
                 public String make(Book book, BookFtl bookFtl) {
                     Configuration cfg = new Configuration();//配制
                      String realPath = bookFtl.getRealPath();
                     String templatePath = realPath + "/WEB-INF/templates/book";
                     String cDateStr = "book/" +
                                       new SimpleDateFormat("yyyyMMdd").format(new java.util.
                             Date());
                     String filePostfix = ".html";
                     String path = realPath + "/" + cDateStr;
                     String fileTimeName = new SimpleDateFormat("yyyyMMddhhmmss").format(new
                             java.util.Date());
                     String returnFileName = cDateStr + "/" + fileTimeName + filePostfix;
                     String fileName = "";
                     File bookDir = new File(path);
                     if (bookDir.exists()) {
                         fileName = path + "/" + fileTimeName + filePostfix;
                     } else {
                         bookDir.mkdirs();
                         fileName = path + "/" + fileTimeName + filePostfix;
                     }
                     try {
                         //设置freemarker的参数
                         cfg.setNumberFormat("0.##########");//生成html文件时web.xml配制无效
                         //cfg.setEncoding();
                         cfg.setDirectoryForTemplateLoading(new File(templatePath));
                         cfg.setObjectWrapper(new DefaultObjectWrapper());
                         Template bookTemplate = cfg.getTemplate(bookFtl.getTemplateName());//模板对象
                         Map root = new HashMap();
                         root.put("book", book);
                         root.put("book2",book);
                         Writer out = new OutputStreamWriter(new FileOutputStream(fileName));
                         try {
                             bookTemplate.process(root, out);
                         } catch (TemplateException e) {
                             e.printStackTrace();
                         }
                         out.flush();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                     return returnFileName;
                 }
            }
 
分享到:
评论

相关推荐

    Freemarker常用语法

    Freemarker常用语法

    freeMarker常用语法.txt

    FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为 interpolation(插值)。

    freemarker基本语法整理

    freemarker常用标签整理,struts2+freemarker做表现层应用,flt中freemarker写法

    FreeMarker

    FreeMarker常用语法,适用于初学者,好好学习天天向上

    freemarker语法完整版

    Freemarker页面语法 A 概念 最常用的 3 个概念 sequence 序列,对应java 里的list 、数组等非键值对的集合 hash 键值对的集合 namespace 对一个ftl 文件的引用, 利用这个名字可以访问到该ftl 文件的资源 ...

    FreeMarker语法

    FreeMarker语法描述 1.FTL指令规则 2.插值规则 3.表达式 4.FreeMarker的常用指令

    freemarker手册

    主要是介绍freemarker的语法以及常用的使用方法!

    超强freemarker使用总结,有示例有讲解,可做快速查询手册!!

    在开发web项目的时候使用到的页面展现技术,它并...总体,该文档能够提供所有常用的freemarker操作,示例和简略的讲解可以让人一下子就能上手,效率极高。 适合做快速查阅册子,同时也非常适合初学者和骨灰开发者使用。

    freemarker总结

    JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: &lt;#if condition&gt;... &lt;#elseif condition&gt;... &lt;#elseif condition&gt;......

    freemarker 例子

     大家常用的基于模板的生成工具,可能包括FreeMarker ,velocity等,语法结构都类似且简单,上手非常快,一个下午足矣。  相比较 FreeMarker 而言,Velocity 更加简单、轻量级,但它的功能却没有 FreeMarker 那么...

    java web 标签大全.CHM

    struts 1 各类型标签 struts 2 标签 jstl 各类型标签 spring 标签 jsf标签 jsp标签、语法 freemarker语法 velocity语法 ajax常用函数 常用js表单检测函数 常用js函数

    java-web-tags.zip_4 3 2 1_JAVA 语法 大全_JSTL_jsp 表单_web-tags

    java web 标签大全,包括1、struts 1 各类型标签;2、struts 2 标签;...7、freemarker语法;8、velocity语法;9、ajax常用函数;10、常用js表单检测函数;11、常用js函数;12、多功能jsp编辑器(eclipse插件);

    web标签大全

    html ajax struts2 jstl spring js常用函数 freemarker语法等

    java web 标签大全

    Struts2 标签 Struts bean ...Struts logic Struts nested JSTL 核心标签 ...freemarker语法 velocity 语法 JSF 核心标签 JSF 表单标签 AJAX 常用函数 JS 常用检测函数 JS 常用函数 JSP 编辑器(eclipse插件)

    FreeMarker模板引擎-其他

    所有常用的指令:include、if/elseif/else、循环结构 在模板中创建和改变变量 几乎在任何地方都可以使用复杂表达式来指定值 命名的宏,可以具有位置参数和嵌套内容 名字空间有助于建立和维护可重用的宏库,或者将一...

    java+web+标签大全.CHM

    本手册收集了:1、struts 1 各类型标签2、struts 2 标签3、jstl 各类型标签4、spring 标签5、jsf标签6、jsp标签、语法7、freemarker语法8、velocity语法9、ajax常用函数10、常用js表单检测函数11、常用js函数12、多...

    javaWeb标签库大全API

    本手册收集了: 1、struts 1 各类型标签 2、struts 2 标签 ...7、freemarker语法 8、velocity语法 9、ajax常用函数 10、常用js表单检测函数 11、常用js函数 12、多功能jsp编辑器(eclipse插件)

    javaWeb 标签大全2.0.CHM

    本册收集了: 1、Struts2标签 2、struts 1 各类型标签 3、JSTL 各类型标签 ...7、freemarker语法 8、velocity语法 9、ajax常用函数 10、常用js表单检测函数 11、常用js函数 12、多功能jsp编辑器(eclipse插件)

Global site tag (gtag.js) - Google Analytics