Freemarker例子

1.引入架包

2.写ftl文件

3.代码

hello.ftl

你好啊,${hello},今天你的精神不错!
if else 语句测试
<#if num gt 18><#-- 不使用 >,大部分时候,freemarker会把 > 解释成标签结束!-->
     及格!
<#else>
    不及格!
</#if>

测试list
<#list list as dizhi >
    <b>${dizhi.country}</b> <br/>
</#list>

测试对象
    <b>${address.country}</b> <br/>

自定义指令(macro 对象)
<#macro jason>
    <a>jason</a>
    <b>hello!</b>
</#macro>

<#macro jason1 a b c>
<a>jason${a}</a>
    <b>hello!${b}</b>
    <b>hello!${c}</b>
</#macro>
调用自定义指令
    <@jason />
    <@jason />

带参数的指令
    <@jason1 a="jason" b="hello" c="a" /> <#-- 如果少参数,c is not specified. -->

address.java

package com.jason.myfressmarker;

public class Address {
    private String country;

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
    private String city;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

test.java

package com.jason.myfressmarker;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class Test {

    public static void main(String[] args) throws IOException,
            TemplateException {
        // 创建Freemarker配置实例
        Configuration cfg = new Configuration();
        cfg.setDirectoryForTemplateLoading(new File("templates"));

        //创建数据模型
        // Map<String, String> root = new HashMap<String, String>();
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("hello", "你好");
        root.put("user", "老高");
        root.put("num", 18);

        Address address = new Address();
        address.setCity("上海");
        address.setCountry("上海市");
        root.put("address", address);

        List<Address> list = new ArrayList<Address>();
        list.add(address);
        root.put("list", list);
        //加载模板文件
        Template template = cfg.getTemplate("hello.ftl");

        // 显示生成的数据
        Writer out = new OutputStreamWriter(System.out);
        template.process(root, out);
        out.flush();
        out.close();
    }

}

到此一个简单的项目已经写成

下面的简单介绍来自:

Copyright (C) 2010-2011 北京尚学堂
数据类型
一、    直接指定值
直接指定值可以是字符串、数值、布尔值、集合及Map对象。
1. 字符串
直接指定字符串值使用单引号或双引号限定。字符串中可以使用转义字符”\"。如果字符串内有大量的特殊字符,则可以在引号的前面加上一个字母r,则字符串内的所有字符都将直接输出。

2. 数值
数值可以直接输入,不需要引号。FreeMarker不支持科学计数法。

3. 布尔值
直接使用true或false,不使用引号。

4. 集合
集合用中括号包括,集合元素之间用逗号分隔。
使用数字范围也可以表示一个数字集合,如1..5等同于集合[1, 2, 3, 4, 5];同样也可以用5..1来表示[5, 4, 3, 2, 1]。

5. Map对象
Map对象使用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔。
注意:Map对象的key和value都是表达式,但key必须是字符串。

6. 时间对象
root.put("date1", new Date());
${date1?string("yyyy-MM-dd HH:mm:ss")}

7. JAVABEAN的处理
    Freemarker中对于javabean的处理跟EL表达式一致,类型可自动转化!非常方便!
二、    输出变量值
FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性。

1. 顶层变量
所谓顶层变量就是直接放在数据模型中的值。输出时直接用${variableName}即可。

2. 输出集合元素
可 以根据集合元素的索引来输出集合元素,索引用中括号包括。如: 输出[“1”, “2”, “3”]这个名为number的集合,可以用${number[0]}来输出第一个数字。FreeMarker还支持用number[1..2]来表示原 集合的子集合[“2”, “3”]。

3. 输出Map元素
对于JavaBean实例,FreeMarker一样把它看作属性为key,属性值为value的Map对象。
输出Map对象时,可以使用点语法或中括号语法,如下面的几种写法的效果是一样的:
             book.author.name
             book.author["name"]
             book["author"].name
             book["author"]["name"]
使用点语法时,变量名字有和顶层变量一样的限制,但中括号语法没有任何限制。
三、字符串操作
1. 字符串连接
字符串连接有两种语法:
(1) 使用${..}或#{..}在字符串常量内插入表达式的值;
(2)  直接使用连接运算符“+”连接字符串。
如,下面两种写法等效:
              ${"Hello, ${user}"}
              ${"Hello, " + user + "!"}
有一点需要注意: ${..}只能用于文本部分作为插值输出,而不能用于比较等其他用途,如:
              <#if ${isBig}>Wow!</#if>
              <#if "${isBig}">Wow!</#if>
应该写成:
              <#if isBig>Wow!</#if>                                                                                                                     

2. 截取子串
截取子串可以根据字符串的索引来进行,如果指定一个索引值,则取得字符串该索引处的字符;如果指定两个索引值,则截取两个索引中间的字符串子串。如:
              <#assign number="01234">
              ${number[0]} <#-- 输出字符0 -->
              ${number[0..3]} <#-- 输出子串“0123” -->

四、集合连接操作
      连接集合的运算符为“+”

五、Map连接操作
   Map连接操作的运算符为“+”

六、算术运算符
   FreeMarker表达式中支持“+”、“-”、“*”、“/”、“%”运算符。

七、比较运算符
表达式中支持的比较运算符有如下几种:
1. =(或者==): 判断两个值是否相等;
2. !=: 判断两个值是否不相等;
注: =和!=可以用作字符串、数值和日期的比较,但两边的数据类型必须相同。而且FreeMarker的比较是精确比较,不会忽略大小写及空格。
3. >(或者gt): 大于
4. >=(或者gte): 大于等于
5. <(或者lt): 小于
6. <=(或者lte): 小于等于
注: 上面这些比较运算符可以用于数字和日期,但不能用于字符串。大部分时候,使用gt比>有更好的效果,因为FreeMarker会把>解释成标签的结束字符。可以使用括号来避免这种情况,如:<#if (x>y)>。
if else 语句测试:
<#if num0 gt 18>  <#--不是使用>,大部分时候,freemarker会把>解释成标签结束! -->
    及格!
<#else>
    不及格!
</#if>
root.put("num0", 18);

八、逻辑运算符
1. &&: 逻辑与;
2. ||: 逻辑或;
3. !: 逻辑非
逻辑运算符只能用于布尔值。
九、内建函数
FreeMarker提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来转换输出变量。

字符串相关常用的内建函数:
1. html: 对字符串进行HTML编码;
2. cap_first: 使字符串第一个字母大写;
3. lower_case: 将字符串转成小写;
4. upper_case: 将字符串转成大写;

集合相关常用的内建函数:
1. size: 获得集合中元素的个数;

数字值相关常用的内建函数:
1. int: 取得数字的整数部分。

举例:
root.put("htm2", "<b>粗体</b>");
内建函数:
${htm2?html}

十、空值处理运算符
FreeMarker的变量必须赋值,否则就会抛出异常。而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。
FreeMarker提供两个运算符来避免空值:
1. !: 指定缺失变量的默认值;
2. ??:判断变量是否存在。
!运算符有两种用法:variable!或variable!defaultValue。第一种用法不给变量指定默认值,表明默认值是空字符串、长度为0的集合、或长度为0的Map对象。
使用!运算符指定默认值并不要求默认值的类型和变量类型相同。

测试空值处理:
<#-- ${sss} 没有定义这个变量,会报异常! -->
${sss!} <#--没有定义这个变量,默认值是空字符串! -->
${sss!"abc"} <#--没有定义这个变量,默认值是字符串abc! -->

    ??运算符返回布尔值,如:variable??,如果变量存在,返回true,否则返回false。

数据类型常见示例
 直接指定值
?   字符串 : "Foo"或 者‘Foo‘或"It‘s \"quoted\""或r"C:\raw\string"
?   数字:123.45
?   布尔值:true, false
?   序列:["foo", "bar", 123.45], 1..100
?   哈希表:{"name":"green mouse", "price":150}
?   检索变量 ?   顶层变量:user
?   从哈希表中检索数据:user.name, user[“name”]
?   从序列中检索:products[5]
?   特殊变量:.main
?   字符串操作
?   插值(或连接):"Hello ${user}!"(或"Free" + "Marker")
?   获取一个字符:name[0]
?   序列操作
?   连接:users + ["guest"]
?   序列切分:products[10..19]  或  products[5..]
?   哈希表操作
?   连接:passwords + {"joe":"secret42"}
?   算数运算: (x * 1.5 + 10) / 2 - y % 100
?   比 较 运 算 : x == y,   x != y,   x < y,   x > y,   x >= y,   x <= y,
x &lt; y,  等等
?    逻辑操作:!registered && (firstVisit || fromEurope)
?    内建函数:name?upper_case
?    方法调用:repeat("What", 3)
?   处理不存在的值
?   默认值:name!"unknown"  或者(user.name)!"unknown"  或者
name!  或者  (user.name)!
?   检测不存在的值:name?? 或者(user.name)??
         参考:运算符的优先级
模板开发语句
最简单的模板是普通  HTML  文件(或者是其他任何文本文件—FreeMarker  本身不属于HTML)。当客户端访问页面时,FreeMarker 要发送 HTML 代码至客户端浏览器端显示。如果想要页面动起来,就要在 HTML 中放置能被 FreeMarker 所解析的特殊部分。 

${…}:FreeMarker 将会输出真实的值来替换花括号内的表达式,这样的表达式被称为
interpolations 插值,可以参考第上面示例的内容。

    FTL tags 标签(FreeMarker  模板的语言标签):FTL 标签和 HTML 标签有一点相似,但是它们是  FreeMarker  的指令而且是不会直接输出出来的东西。这些标签的使用一般以符号#开头。(用户自定义的 FTL 标签使用@符号来代替#,但这是更高级的主题内容了,后面会详细地讨论) 

Comments 注释:FreeMarker 的注释和 HTML 的注释相似,但是它用<#--和-->来分隔的。任何介于这两个分隔符(包含分隔符本身)之间内容会被 FreeMarker  忽略,就不会
输出出来了。 

    其他任何不是  FTL  标签,插值或注释的内容将被视为静态文本,这些东西就不会被
FreeMarker 所解析,会被按照原样输出出来。 

    directives指令:就是所指的  FTL  标签。这些指令在  HTML  的标签(如<table>和
</table>)和 HTML 元素(如 table 元素)中的关系是相同的。(如果现在你还不能区
分它们,那么把“FTL 标签”和“指令”看做是同义词即可。)
if指令
root.put("random", new Random().nextInt(100));
------------------------------------------------
if语句测试:
${user}是<#if user=="老高">我们的老师</#if>
------------------------------------------------
if else 语句测试:
<#if num0 gt 18>  <#--不是使用>,大部分时候,freemarker会把>解释成标签结束! -->
    及格!
<#else>
    不及格!
</#if>
---------------------------------------------------
if else if else语句测试:
<#if random gte 90>
    优秀!
<#elseif random gte 80>
    良好!
<#else>
    一般!
</#if>
----------------------------------------------------

list指令
        List list = new ArrayList();
        list.add(new Address("中国","北京"));
        list.add(new Address("中国","上海"));
        list.add(new Address("美国","纽约"));
        root.put("lst", list);
测试list指令:
<#list lst as dizhi >
    <b>${dizhi.country}</b> <br/>
</#list>

思考问题:<c:forEach> status属性。在此处如何实现?

控制台打印:
测试list语句:
    <b>中国</b> <br/>
    <b>中国</b> <br/>
    <b>美国</b> <br/>

include指令
增加被包含文件,放于templates目录下:

文件内容如下:

模板文件中代码如下:
测试include指令:
<#include "included.txt" />

自定义指令(macro指令)
<#macro m1>   <#--定义指令m1 -->
    <b>aaabbbccc</b>
    <b>dddeeefff</b>
</#macro>
<@m1 /><@m1 />  <#--调用上面的宏指令 -->

定义带参的宏指令:
<#macro m2 a b c >
    ${a}--${b}--${c}
</#macro>
<@m2 a="老高" b="老张" c="老马" />

nested指令:
<#macro border>
  <table border=4 cellspacing=0 cellpadding=4><tr><td>
    <#nested>
  </td></tr></table>
</#macro>
<@border >表格中的内容!</@border>

欧阳鸿:宏指令中,有没有类似于方法的返回值?
命名空间
当运行 FTL 模板时,就会有使用 assign 和 macro 指令创建的变量的集合(可能是空的),可以从前一章节来看如何使用它们。像这样的变量集合被称为 namespace 命名空间。在简单的情况下可以只使用一个命名空间,称之为 main namespace 主命名空间。因为通常只使用本页上的命名空间,所以就没有意识到这点。
    如果想创建可以重复使用的宏,函数和其他变量的集合,通常用术语来说就是引用
library 库。使用多个命名空间是必然的。只要考虑你在一些项目中,或者想和他人共享使用的时候,你是否有一个很大的宏的集合。但要确保库中没有宏(或其他变量)名和数据模型中变量同名,而且也不能和模板中引用其他库中的变量同名。通常来说,变量因为名称冲突也会相互冲突。所以要为每个库中的变量使用不同的命名空间。

定义b.ftl文件:
<#macro copyright date>
  <p>Copyright (C) ${date} 北京尚学堂.</p>
</#macro>
<#assign mail = "[email protected]">

在a.ftl文件中引入b.ftl,从而可以使用b.ftl中定义的宏和变量:
测试命名空间:
<#import "b.ftl" as bb  />
<@bb.copyright date="2010-2011" />
${bb.mail}
<#assign mail="[email protected]"  />
${mail}
<#assign mail="[email protected]" in bb  />
${bb.mail}

执行后,控制台打印:
测试命名空间:
  <p>Copyright (C) 2010-2011 北京尚学堂.</p>
[email protected]
[email protected]
[email protected]

命名空间命名规则
如果你为 Example 公司工作,它们拥有 www.example.com 网的主页,你的工作是开发
一个部件库,那么要引入你所写的 FTL 的路径应该是:
/lib/example.com/widget.ftl

注意到 www 已经被省略了。第三次路径分割后的部分可以包含子目录,可以像下面这
样写:
         /lib/example.com/commons/string.ftl
一个重要的规则就是路径不应该包含大写字母,为了分隔词语,使用下划线_,就像
wml_form(而不是 wmlForm)。 

如果你的工作不是为公司或组织开发库,也要注意,你应该使用项目主页的 URL,比如
/lib/example.sourceforge.net/example.ftl或/lib/geocities.com/jsmith/example.ftl。
时间: 2024-08-06 16:05:26

Freemarker例子的相关文章

java工程中使用freemarker例子

新建java project,引入freemarker.jar, 本工程是用的版本:freemarker-2.3.20 版本 java工程目录如下: test.ftl文件 HTML代码 1 name : ${name} 2 age : ${age} Java代码 1 package com.freemarker; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.OutputStreamWriter;

大数据学习总结记录—页面静态化技术(Freemarker/velocity)&amp; 网站伪静态(UrlRewriteFilter)

Freemaker  静态化模板技术 模板的作用 模板技术在现代的软件开发中有着重要的地位,而目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity作为view,模板技术作为view的好处是很多,尤其和jsp比较起来优点更大,众所周知jsp需要在第一次被执行的时候编译成servlet,那么这个过程是很慢的,当然很多应用服务器都提供预编译的功能,但是在开

Beetl2.2使用说明书20151201

李家智<[email protected]> Table of Contents 1. 什么是Beetl 2. 基本用法 2.1. 从GroupTemplate开始 2.2. 模板基础配置 2.3. 模板资源加载器 2.4. 定界符与占位符号 2.5. 注释 2.6. 临时变量定义 2.7. 全局变量定义 2.8. 共享变量 2.9. 模板变量 2.10. 引用属性 2.11. 算数表达式 2.12. 逻辑表达式 2.13. 循环语句 2.14. 条件语句 2.15. try-catch 2.

freemarker入门小例子

我用freemarker做了两个小例子,主要的东西是:两个Test文件,一个Animal实体类,一个ftl模板---freemarker的模板,我使用maven做的java工程案例.主要结构内容如下图: 注意:需要导入freemarker的jar包: 1.首先我们先来了解一下freemarker的概念: freeMarker概述: FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写: FreeMarker被设计用来生成HTML Web页面,特别是基于MVC

freemarker入门例子

freemarker入门例子,直接代码如下: FreeMarkerTest import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impor

Spring与FreeMarker的小例子

由于项目需要,需要使用FreeMarker ,今天正好研究就写了一个简单的小例子 首先配置web.xml,  <servlet>    <servlet-name>springmvc</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>     <para

Freemarker 最简单的例子程序

首先导入包,freemarker.jar 下载地址: freemarker-2.3.18.tar.gz http://cdnetworks-kr-1.dl.sourceforge.net/project/freemarker/freemarker/2.3.18/freemarker-2.3.18.tar.gz 当然如果是Maven项目,可以从仓库里面下载,这里不赘述; 1.通过String来创建模版对象,并执行插值处理 import freemarker.template.Template; i

freemarker技术入门例子(结合struts2)

由于最近项目里面要求要使用freemarker技术来做展现层,所以在网上搜索了好多资料,基础知识是看了李刚原来写的那本<struts2权威指南>.一直想在网上找一个很基础的例子来入门,但是不知道是我的原因还是怎么的,找到的都不是很理想,而且网上基本上是一篇文章到处贴.所以郁闷之下,就自己慢慢摸索写出了一个入门的例子,可以作为自己的总结,也可以让更多的初学者快速入门. 闲话少述,看例子. *****例子的整个目录结构如下图: 说明:1.struts-tags.tld文件是由struts2的jar

字符串作为freemarker模板的简单实现例子

原文:http://blog.csdn.net/5iasp/article/details/27181365 package com.test.demo; import java.io.IOException; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import freemarker.cache.StringTemplateLoader; import freemarker.tem