`
- 浏览:
209700 次
- 性别:
- 来自:
厦门
-
-
- 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}
-
${book?string.currency}
-
${book?string.percent}—<#
-
- 插入布尔值:
- <#assign foo=ture />
-
${foo?string("yes","no")} <#
-
-
- 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 >
-
-
<#
-
-
- 在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} <#
-
- <@test/>
-
6. ${x} <#
-
<#list ["loop"] as x>
-
7. ${x} <#
-
<#assign x = "plain2"> <#
-
8. ${x} <#
- </#list>
-
9. ${x} <#
- <#macro test>
-
2. ${x} <#
-
<#local x = "local">
-
3. ${x} <#
-
<#list ["loop"] as x>
-
4. ${x} <#
- </#list>
-
5. ${x} <#
- </#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} <#
-
${.globals.user} <#
- 名字空间
- 通常情况,只使用一个名字空间,称为主名字空间,但为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,
-
- 其目的是防止同名冲突
- 创建库
- 下面是一个创建库的例子(假设保存在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;
- }
- }
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### Freemarker语法规则教程 #### 一、字符串格式化输出 在Freemarker中,字符串格式化是一项非常实用的功能,它可以将数据按照特定的格式进行输出,方便开发者控制最终的展示效果。以下是一些基本的例子: - **...
### FreeMarker语法详解 #### 一、FreeMarker模板文件组成 FreeMarker模板文件与普通的HTML页面相比,并不显得更为复杂。其主要组成部分包括: 1. **文本**:这部分内容会被直接输出到最终生成的文档中。 2. **...
Freemarker语法完整版 Freemarker是基于模板的生成技术,可以根据给定的数据模型生成动态的文本输出。在Freemarker中,存在五种基本概念:Scalars、Hashes、Sequences、Collection Variables和Methods。 1. ...
以下是关于Freemarker语法规则的详细解释: 1. **变量表达式**: Freemarker中的变量表达式通常以`${}`包裹,用来输出Java对象的属性值。例如,如果有一个名为`user`的对象,其`name`属性为"张三",那么`${user....
### FreeMarker语法参考详解 #### 一、FreeMarker概述与基本语法 FreeMarker是一个用Java编写的模板引擎,它能够将数据模型与表现层(HTML、XML等)分离,使得前端展示逻辑与后端业务逻辑可以独立开发和维护。本文...
### Freemarker语法完整版知识点详解 #### A. 概念 **1. Scalars(标量)** - **字符串**: 由单引号或双引号括起来的文本。 - **数字**: 直接使用数值。 - **日期**: 通常从数据模型中获取。 - **布尔值**: `...
### Java Freemarker 语法详解 #### 一、Freemarker 概述与基本概念 Freemarker 是一种用于生成动态内容的模板引擎,它能够帮助开发者将数据模型中的数据渲染到 HTML 页面上,从而实现前后端分离的效果。...
以下是对Freemarker语法大全的一些关键点的详细解释: 1. **指令**: - `if`、`else`、`elseif`:用于条件判断,可以根据条件执行不同的代码块。 - `switch`、`case`、`default`、`break`:提供多分支选择,类似...
以下是关于Freemarker语法的详细说明: 1. **Scalars**: - 字符串:可以通过单引号或双引号定义,特殊字符需要转义。 - 数字:直接写入,支持整数和浮点数,但不支持科学计数法。 - 日期:通常从数据模型获取,...
### Freemarker语法详解 Freemarker是一款非常强大的模板引擎,被广泛应用于Web开发之中,用于动态页面的生成。本文将详细介绍Freemarker中的一些常用语法,并通过具体的示例帮助理解。 #### 1. `if`, `else`, `...
### FreeMarker 语法基础 #### 一、FreeMarker 模板结构 FreeMarker 是一种用于生成文本输出的模板引擎,其模板文件结构简单且易于理解。一个典型的 FreeMarker 模板文件由以下四个主要部分组成: 1. **文本**:...
再者,从语法格式上来讲,Velocity 和 Freemarker 的语法格式不同,Velocity 的语法更加简洁,而 Freemarker 的语法更加灵活。不同的开发者可能会有不同的倾向性,但是Freemarker 的语法更加强大。 最后,从性能上...
了解并熟练运用这些FreeMarker语法知识,可以显著提升网站的动态内容生成速度和用户体验。通过灵活运用FTL指令和插值,可以实现复杂的逻辑和数据展示,使得模板设计更为简洁、高效。在实际项目中,结合合理的数据...
### FreeMarker语法详解 #### 一、概述 FreeMarker是一个强大的模板引擎,广泛应用于Web开发领域,用于将数据模型中的数据动态地填充到HTML、XML等格式的文档中。其核心概念包括文本、注释、插值以及FTL指令。 ##...
以下是对 Freemarker 语法的详细解释: 1. **指令:** - **if, else, elseif**:用于条件判断。`<#if condition>`检查条件,如果为真则执行相应代码,`<#elseif condition2>`用于添加额外的条件分支,`<#else>`则...
### FreeMarker语法详解 #### 一、FTL指令规则 FreeMarker使用FTL(FreeMarker Template Language)指令来实现各种逻辑处理。这些指令类似于HTML标签,但它们具有不同的功能。 1. **开始标签**:`...
### FreeMarker语法知识详解 #### 一、FreeMarker概述 FreeMarker是一种强大的模板引擎,用于生成文本输出。它被广泛应用于Web开发中,用于动态生成HTML页面以及其他类型的文本文件,如XML、JavaScript、电子邮件等...