FreeMarker教程整理

网上看了很多相关的资料,感觉乱乱的,现在整理一下,按照以下思路来学习,相信会轻松不少,转载资料已注明


一、先对Freemarker有个概念——摘自百度百科

1、FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件配置文件源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

2、工作原理

假设在一个应用系统中需要一个HTML页面如下:

1
2
3
4
5
6
7
8
9
10
< html >
     < head >
         < title >Welcome!</ title >
     </ head >
     < body >
         < h1 >Welcome Big Joe!</ h1 >
         < p >Our latest product:
         < a  href = "products/greenmouse.html" >green mouse</ a >!
     </ body >
</ html >
页面中的 用户名(即上面的“Big Joe”)是登录这个网页的访问者的名字, 并且最新产品的数据应该来自于 数据库才能随时更新。所以,不能直接在HTML页面中输入“Big Joe”、“greenmouse”及 链接, 不能使用静态HTML代码。可以使用要求输出的 模板来解决,模板和 静态页面是相同的,只是它会包含一些FreeMarker将它们变成动态内容的指令:
1
2
3
4
5
6
7
8
9
10
< html >
     < head >
         < title >Welcome!</ title >
     </ head >
     < body >
         < h1 >Welcome ${user}!</ h1 >
         < p >Our latest product:
         < a  href = "${latestProduct.url}" >${latestProduct.name}</ a >!
     </ body >
</ html >
模板文件存放在 Web服务器上,当有人来访问这个页面,FreeMarker就会介入执行,然后动态转换模板,用最新的数据内容替换模板中 ${...}的部分,之后将结果发送到访问者的 Web浏览器中。访问者的Web浏览器就会接收到例如第一个HTML示例那样的内容(也就是没有FreeMarker指令的HTML代码),访问者也不会察觉到服务器端使用的FreeMarker。(存储在Web服务器端的模板文件是不会被修改的;替换也仅仅出现在Web服务器的响应中。)

二、做一个简单的示例,先不用管原理,看下效果——转自http://www.cnblogs.com/linjiqin/p/3387972.html

首先需要到freemarker官方下载freemarker的jar包,导入到项目中,如:freemarker-2.3.19.jar

1、先建个freemarker的工具类,FreemarkerUtil.java

复制代码
package com.ljq.fm;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

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

public class FreemarkerUtil {

    public Template getTemplate(String name) {
        try {
            // 通过Freemaker的Configuration读取相应的ftl
            Configuration cfg = new Configuration();
            // 设定去哪里读取相应的ftl模板文件
            cfg.setClassForTemplateLoading(this.getClass(), "/ftl");
            // 在模板文件目录中找到名称为name的文件
            Template temp = cfg.getTemplate(name);
            return temp;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 控制台输出
     * 
     * @param name
     * @param root
     */
    public void print(String name, Map<String, Object> root) {
        try {
            // 通过Template可以将模板文件输出到相应的流
            Template temp = this.getTemplate(name);
            temp.process(root, new PrintWriter(System.out));
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 输出HTML文件
     * 
     * @param name
     * @param root
     * @param outFile
     */
    public void fprint(String name, Map<String, Object> root, String outFile) {
        FileWriter out = null;
        try {
            // 通过一个文件输出流,就可以写到相应的文件中,此处用的是绝对路径
            out = new FileWriter(new File("E:/" + outFile));
            Template temp = this.getTemplate(name);
            temp.process(root, out);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
复制代码

2 、在src目录下建个ftl包,用于存放ftl模板文件,this.getClass() 就是根据当前类的路径获取模板文件位置(此处已做修改,去掉了两个重复的)
01.ftl

复制代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试</title>
</head>

<body>
<h1>你好${username}</h1>
</body>
</html>
复制代码


02.ftl

复制代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${user.id}-----${user.name}-----${user.age}</h1>
<#if user.age lt 12>
    ${user.name}还是一个小孩
<#elseif user.age lt 18>
    ${user.name}快成年
<#else>
    ${user.name}已经成年
</#if>
</body>
</html>
复制代码

03.ftl

复制代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<#list users as user>
${user.id}---------${user.name}-------${user.age}<br/>
</#list>
</body>
</html>
复制代码

04.ftl

复制代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>

<body>
${user.id}-------${user.name}------${user.group!}  <#-- !后为空就不输出  -->
<#--${user.group.name!}--><#-- 按照以上的方式加! freemarker仅仅只会判断group.name是不是空值 -->
${(user.group.name)!"1234"} 

${(a.b)!"没有a.b元素"}

<#--
!:指定缺失变量的默认值 
??:判断某个变量是否存在,返回boolean值 
-->
<#if (a.b)??> <#--if后不用加$-->
    不为空
<#else>
    为空
</#if>
</body>
</html>
复制代码

实体类User.java

复制代码
package com.ljq.fm;

import java.io.Serializable;

@SuppressWarnings("serial")
public class User implements Serializable {
    private int id;
    private String name;
    private int age;
    private Group group;

    public Group getGroup() {
        return group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
复制代码

实体类Group.java

复制代码
package com.ljq.fm;

/**
 * 
 * 
 * @author 林计钦
 * @version 1.0 2013-10-25 下午02:36:09
 */
public class Group {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
复制代码

3、再建个Junit的测试类 FreemarkerTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public  class  FreemarkerTest {
     @Test
     public  void  test(){
         FreemarkerUtil util =  new  FreemarkerUtil();
         Map<String, Object> map =  new  HashMap<String, Object>();
 
         Group group =  new  Group();
         group.setName( "IT" );
         
         User user =  new  User();
         user.setId( 001 );
         user.setName( "张三" );
         user.setAge( 12 );
         user.setGroup(group);
         
         List<User> users =  new  ArrayList<User>();
         users.add(user);
         users.add(user);
         users.add(user);
         
         map.put( "user" , user);
         //普通EL赋值
         //util.print("01.ftl", map ); 
         //判断
         //util.fprint("02.ftl", map, "02.html");
         //遍历
//map.put("users",users); 
         //util.print("03.ftl", map);   
         //子元素判断
         util.print( "04.ftl" , map);
     }

     public static void main(String[] args) {
FreemarkerTest test=new FreemarkerTest();
test.test();
}
}

上述实例完毕之后,对freemarker应该有个大致的了解


三、具体教程——内容太多了,直接贴上两个地址

1、http://demojava.iteye.com/blog/800204——关于指令方面的介绍

2、http://wenku.baidu.com/link?url=qnIVrH5QYCzr7KOBLQoL1KSft3diK07mOxeeROOI4U_AyfciL_oep_JLWJLda0jC5z1QxMlJlDnoGlix0K26etdNVpKamw_ysOg0OJMjbCW——百度文库上一篇关于代码的介绍

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值